文件先上传到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";
//检查上传路径是否存在 如果不存在返回false
boolean flag = ftp.changeWorkingDirectory(path);
if(!flag){
//创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image
ftp.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即可。