一直感觉文件上传与下载是个很麻烦的事情,今天一早突然就想克服下这个问题:
简单的先总结下,后面补充具体的实现,其实归根到底就这几件事情:
1、搭建文件服务器:搭建ftp文件服务器,使用nginx作为http服务,在windows上面实现对文件服务器资源的访问。
2、文件服务器搭建完了,那么怎么进行上传,那就需要我们的java代码了:
(1)位置:文件在哪里,如何获取文件?
(2)上传的位置:文件上传到哪里?即上传文件的地址端口等等,要获取到,连接上才可以?
(3)文件名的处理:原来的文件名是多少,即原始file的文件名,上传到文件服务器上面的文件名如何命名?
(4)最后,使用什么工具来进行这些操作。SpringMVC 用的是 的MultipartFile来进行文件上传。有没有更好的处理连接文件服务器的工具。ftpclient。
3、下面我们具体来说说怎么使用吧,尤其是使用了springboot后如何来进行文件的上传下载?
使用springboot进行图片上传功能,这里我们依然是使用的springMVC的MultipartFile这个工具。其实根本思路也是如此:
举个例子我们从计算机中的D盘获取到文件A,这个时候程序是怎么来获取的呢,这里我们从前端页面获取到这个A后,在后台我们通过servlet的上下文环境会创建一个相对路径来保存这个文件A。一般创建的文件夹会在webapp下面,会创建一个例如upload的文件夹。
然后我们会通过字符串的处理方式获取文件A的后缀名,重新命名一个新的名称。
然后我们从upload中将这个文件上传到ftp服务器上面。这个时候我们就需要连接ftp服务器了。此时的ftp服务器我们使用ftpclient来进行与服务器的连接登录等问题。
好了,至此文件已经上传到了ftp服务器上,这个时候不要忘记了,把upload文件中的文件删除,因为我们会不停的上传文件,会导致这个upload中的文件内容很多。
这里是使用的propertiesutil来读取属性配置文件:
工具类我们看下:
package com.mmall.util;import org.apache.commons.net.ftp.FTPClient;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.List;/** * Created by geely */public class FTPUtil { private static final Logger logger = LoggerFactory.getLogger(FTPUtil.class); private static String ftpIp = PropertiesUtil.getProperty("ftp.server.ip"); private static String ftpUser = PropertiesUtil.getProperty("ftp.user"); private static String ftpPass = PropertiesUtil.getProperty("ftp.pass"); public FTPUtil(String ip,int port,String user,String pwd){ this.ip = ip; this.port = port; this.user = user; this.pwd = pwd; } public static boolean uploadFile(ListfileList) throws IOException { FTPUtil ftpUtil = new FTPUtil(ftpIp,21,ftpUser,ftpPass); logger.info("开始连接ftp服务器"); boolean result = ftpUtil.uploadFile("img",fileList); logger.info("开始连接ftp服务器,结束上传,上传结果:{}"); return result; } private boolean uploadFile(String remotePath,List fileList) throws IOException { boolean uploaded = true; FileInputStream fis = null; //连接FTP服务器 if(connectServer(this.ip,this.port,this.user,this.pwd)){ try { ftpClient.changeWorkingDirectory(remotePath); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("UTF-8"); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); for(File fileItem : fileList){ fis = new FileInputStream(fileItem); ftpClient.storeFile(fileItem.getName(),fis); } } catch (IOException e) { logger.error("上传文件异常",e); uploaded = false; e.printStackTrace(); } finally { fis.close(); ftpClient.disconnect(); } } return uploaded; } private boolean connectServer(String ip,int port,String user,String pwd){ boolean isSuccess = false; ftpClient = new FTPClient(); try { ftpClient.connect(ip); isSuccess = ftpClient.login(user,pwd); } catch (IOException e) { logger.error("连接FTP服务器异常",e); } return isSuccess; } private String ip; private int port; private String user; private String pwd; private FTPClient ftpClient; public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public FTPClient getFtpClient() { return ftpClient; } public void setFtpClient(FTPClient ftpClient) { this.ftpClient = ftpClient; }} 处理逻辑的service类:package com.mmall.service.impl;import com.google.common.collect.Lists;import com.mmall.service.IFileService;import com.mmall.util.FTPUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;import java.util.UUID;/** * Created by geely */@Service("iFileService")public class FileServiceImpl implements IFileService { private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class); public String upload(MultipartFile file,String path){ String fileName = file.getOriginalFilename(); //扩展名 //abc.jpg String fileExtensionName = fileName.substring(fileName.lastIndexOf(".")+1); String uploadFileName = UUID.randomUUID().toString()+"."+fileExtensionName; logger.info("开始上传文件,上传文件的文件名:{},上传的路径:{},新文件名:{}",fileName,path,uploadFileName); File fileDir = new File(path); if(!fileDir.exists()){ fileDir.setWritable(true); fileDir.mkdirs(); } File targetFile = new File(path,uploadFileName); try { file.transferTo(targetFile); //文件已经上传成功了 FTPUtil.uploadFile(Lists.newArrayList(targetFile)); //已经上传到ftp服务器上 targetFile.delete(); } catch (IOException e) { logger.error("上传文件异常",e); return null; } //A:abc.jpg //B:abc.jpg return targetFile.getName(); }}