文件上传(上传至独立的文件服务器)
2019独角兽企业重金招聘Python工程师标准>>>
文件先上传到web服务器,再在web服务器里面传送到单独的文件服务器上,在web服务器里面建一个表来保存文件路径即可。
@Service
public class UploadServiceImpl implements UploadService{ 文件服务器地址@Value("${upload.file.url}") private String uploadUrl; @Value("webdav") private String uploadUsername; @Value("webdav") public String uploadPassword; @Override public FileInfo uploadFile(MultipartFile multipartFile) { //取到文件大小,如果超过指定范围的话就直接返回提醒错误 long size = multipartFile.getSize(); //获取文件名 String fileName = multipartFile.getOriginalFilename(); // 获取文件后缀,即文件类型 String fileExt = ""; if (fileName.contains(".")) { fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); } //设置MD5加密 String fileMD5 = md5File(multipartFile); //拼接文件路径:/后缀/年/月/日/md5/filename String saveUrl = "/" + fileExt + new SimpleDateFormat("/yyyy/MM/dd/").format(new Date()) + fileMD5 + "/" + multipartFile.getOriginalFilename(); String location = null; try { location = saveFile(multipartFile, saveUrl);//保存文件操作 } catch (Exception e) { e.printStackTrace(); } FileInfo fileInfo = new FileInfo(); fileInfo.setAbsoluteUrl(location); fileInfo.setRelativeUrl(saveUrl); fileInfo.setFileMd5(fileMD5); fileInfo.setFileName(fileName); fileInfo.setFileSize(String.valueOf(size)); fileInfo.setFileType(fileExt); fileInfo.setCreateAt(DateUtil.date2String(new Date(), DateUtil.DATE_TIME_FORMAT)); return fileInfo; } //MD5加密 private String md5File(MultipartFile multipartFile) { try { return MD5.md5(multipartFile.getBytes()); } catch (IOException e) { e.printStackTrace(); } return null; } private String saveFile(MultipartFile file, String savePath) throws Exception { // 上传文件,到文件服务器,uploadUrl是在config中配好的,就是给uploadUrl赋值,如果不用那么麻烦的话可以直接把url放进去:upload("http://192.168.102.11/test", uploadUsername, uploadPassword, savePath, file.getBytes()); upload(uploadUrl, uploadUsername/*那台服务器的用户名*/, uploadPassword/*那台服务器的密码*/, savePath, file.getBytes()); return append(uploadUrl, savePath); } public static void upload(String webDavServer, String webDavUser, String webDavPassword, String remotePath, byte[] bytes) throws IOException { if (!webDavServer.endsWith("/")) webDavServer += "/"; //连接服务器 HttpURL hrl = new HttpURL(webDavServer); hrl.setUserinfo(webDavUser, webDavPassword); WebdavResource wdr = new WebdavResource(hrl); //make directory if need StringBuffer ssdir = new StringBuffer(); // 去除最后一个文件名 StringTokenizer t = new StringTokenizer(remotePath.substring(0, remotePath.lastIndexOf("/")), "/"); while(t.hasMoreTokens()){ String sdir = t.nextToken(); ssdir.append(sdir+"/"); wdr.mkcolMethod(wdr.getPath() + ssdir ); } String remoteFile= wdr.getPath() + remotePath;//拼成绝对地址 boolean result = wdr.putMethod(remoteFile, bytes);//把文件写进去 checkArgument(result, "文件上传出错");//false时会报错,true则为成功 wdr.close();//最后关闭连接 } /** * 连接 URL * @param paths * @return */ public static String append(String... paths) { List<String> pathList = Lists.newArrayList(paths); PeekingIterator<String> iter = Iterators.peekingIterator(pathList.iterator()); StringBuilder urlBuilder = new StringBuilder(); while (iter.hasNext()) { String current = iter.next(); urlBuilder.append(current); if (!iter.hasNext()) { break; } if (current.endsWith("/") && iter.peek().startsWith("/")) { urlBuilder.deleteCharAt(urlBuilder.length() - 1); } else if (!current.endsWith("/") && !iter.peek().startsWith("/")) { urlBuilder.append("/"); } } return urlBuilder.toString(); } }
(未完待续)
上传至ftp服务器代码如下
public void testFtp1(){//创建客户端对象FTPClient ftp = new FTPClient();InputStream local=null;try {//连接ftp服务器ftp.connect("192.168.80.161", 21);//登录ftp.login("ftpuser", "1111");//设置上传路径String path="/home/ftpuser/image";//检查上传路径是否存在 如果不存在返回falseboolean flag = ftp.changeWorkingDirectory(path);if(!flag){//创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建imageftp.makeDirectory(path);}//指定上传路径ftp.changeWorkingDirectory(path);//指定上传文件的类型 二进制文件ftp.setFileType(FTP.BINARY_FILE_TYPE);//读取本地文件File file = new File("mm.jpg");local = new FileInputStream(file);//第一个参数是文件名ftp.storeFile(file.getName(), local);} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {//关闭文件流local.close();//退出ftp.logout();//断开连接ftp.disconnect();} catch (IOException e) {e.printStackTrace();}}}
还有个野路子:
用nfs共享来实现
查看nfs是否安装
#rpm -qa | grep nfs
若没有则安装nfs包
安装NFS(在网上一些文章上说要安装portmap,新的发布版本上已经不需要了)
sudo yum install nfs-utils
( 这里可以通过yum list|grep nfs* 来查看软件包里面是否有nfs相关的包)
安装完之后,可以是rpm -qa|grep nfs进行查看
写服务端配置文件,先mkdir /tmp/nfs_test
服务端/etc/exports文件的配置格式为:
NFS共享目录 NFS客户端地址1(参数1,参数2,参数3......) 客户端地址2(参数1,参数2,参数3......)
NFS共享目录 NFS客户端地址(参数1,参数2,参数3......)
在/etc/exports中添加:
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
/tmp/nfs_test *(rw,no_root_squash,insecure)
启动
systemctl enable nfs-server.service
systemctl start nfs-server.service
看下是否启动了:
exportfs
showmount -e
showmount -a
在客户端 先安装 nfs设置开机自启动,然后mount到本地目录上
mount -t nfs 9.151.141.111:/tmp/nfs_test /mnt
然后可以在/mnt目录里写文件,建目录,copy文件等等,实际上都是在
服务器端/tmp/nfs_test里面进行的。
也可以将两台机器上的文件相互copy...做备份也方便。
unmount /mnt即可。
转载于:https://my.oschina.net/u/3667353/blog/1627794
文件上传(上传至独立的文件服务器)相关推荐
- formdata上传文件_大文件分片断点上传实现思路以及方案
作者:yeyan1996| 来源:掘金https://juejin.im/post/5dff8a26e51d4558105420ed 前言 我在面试的时候确实被问到了这个问题,而且是一道在线 codi ...
- WEB版一次选择多个文件进行批量上传(Plupload)的解决方案
说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 w ...
- JS开发——文件夹的上传和下载
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器
ftp 上传文件夹到服务器 内容精选 换一换 上传的文件和上传的文件夹中包含的文件支持的格式请参见支持的文件格式.文件上传:从本地上传:在Projects Explorer视图中选中一个文件夹,依次单 ...
- html web上传文件原理,Web上传文件的原理及实现
本文为原创,如需转载,请注明作者和出处,谢谢! 现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Stru ...
- php webuploader大文件,web uploader 上传大文件总结
由于业务需要,需要上传大文件,已有的版本无法处理IE版本,经过调研,百度的 webuploader 支持 IE 浏览器,而且支持计算MD5值,进而可以实现秒传的功能. 大文件上传主要分为三部分,预上传 ...
- xftp不能上传文件到服务器,xftp传文件到云服务器
xftp传文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数 ...
- php获取svn文件,然后ftp上传服务器代码
配置文件 <?php //setup commandline $svn_cmd1 = 'svn.exe update '; $svn_cmd2 = ' --username xxx --pass ...
- form表单刷新_《大胖 ? 小课》- 不用 js 实现文件无刷新上传
这是<大胖小课>栏目的专题一<说说文件上传那些事儿>的第3节-<不用 js 实现文件无刷新上传> 专题已经更新章节: <大胖 • 小课>- 我是这样理解 ...
- hadoop的hdfs文件操作实现上传文件到hdfs
hdfs文件操作操作示例,包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,大家参考使用吧 复制代码代码如下: import org.apache.hadoop.conf.Conf ...
最新文章
- 最小货架剩余寿命\总货架寿命\最大仓储时间
- 阮一峰react demo代码研究的学习笔记 - Chrome extension - react tool
- 十八、对已经找到轮廓的图像进行测量
- swagger访问开关配置
- python list突破上限武器_Python3 tkinter基础 Listbox height 显示行数的上限
- 记录与天猫精灵对接的经验 2020年8月5日
- 友华PT939G移动光猫开启telnet获取配置文件
- 《娱乐至死》读书笔记(摘抄)
- AudioKit 教程:入门
- 南宁城市建设发展市政工程人才需求暴涨
- Dorabot蓝胖子招聘 薪资Open谈|3D视觉、机器人软件、SLAM算法工程师等岗位
- (arxiv-2018)图像检索的注意力感知广义平均池化
- 切克闹!Java8新特性之方法引用
- 视频转gif怎么用手机操作?手机端gif动画制作的方法
- 攻防世界逆向高手题之re2-cpp-is-awesome
- 不锈钢到底是什么样的钢?机械人必备知识!
- 设置 html 最大长度,在CSS中设置最大字符长度
- solidty实现默克尔树空投
- 小米路由器3-R3 刷固件
- Beyond Compare如何连接FTP进行文件夹的比较
热门文章
- 华为麒麟990发布!余承东:全球首款旗舰5G SoC,业界最强手机AI算力,友商还都是PPT...
- Object.create(..)和new(..)的内部实现
- Python(四)IP代理
- [android] 练习样式主题自定义activity切换动画
- 库函数strlen源码重现及注意问题
- 浅谈 Math.BigMul 方法
- ETSI GS MEC 014,UE 标识 API
- 在 ThinkPad E470 上安装 Ubuntu 16.04 无线网卡驱动
- mysql字符串操作
- 分布式调用跟踪系统的设计和应用