在Java Web开发中,经常会用到上传与下载文件,典型的案例即为服务器获取上传的文件,将其保存至本地,并获取其下载的文件url,客户端在获取下载的url后,在服务器进行下载。下面我们就来说一下Java中文件的上传。
一、设置CommonsMultipartResolver
在Spring中,我们可以使用CommonsMultipartResolver来上传文件,所以我们需要声明一个CommonsMultipartResolver的bean对象,也可以明确的告诉Spring上传文件的大小限制:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
其中的maxUploadSize即为最大上传的大小,单位为B,所以10485760为10M
二、CommonsMultipartResolver的使用:
1、得到CommonsMultipartResolver对象:
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //其中request即为我们请求的HttpServletRequest对象
2、判断请求是否为MultiPart File文件上传请求:
boolean isFileUpload = multipartResolver.isMultipart(request);
三、MultipartHttpServletRequest的使用
在确定了是多文件上传的请求后,即可以将HttpServletRequest转成MultipartHttpServletRequest对象,MultipartHttpServletRequest对象封装了文件上传的文件对象,可以通过此对象直接得到文件对象。
1、得到文件名称列表的迭代器:
Iterator<String> iter = multiRequest.getFileNames();
2、取得上传的文件:
MultipartFile file = multiRequest.getFile(iter.next());
四、上传的示例代码:
@ResponseBody
@RequestMapping("/up")
public FileUploadResponse upload(HttpServletRequest request) throws IllegalStateException, IOException, NoSuchAlgorithmException {
String fileHttpPath = "";
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
//记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if (file != null) {
//取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
//如果名称不为空,说明该文件存在,否则说明该文件不存在
if (!myFileName.trim().isEmpty()) {
System.out.println(myFileName);
String fileName = getRondomFileName() + getFileType(myFileName);
//定义本地路径
String path = filePath + fileName;
File localFile = new File(path);
file.transferTo(localFile);
fileHttpPath = fileDownloadPath + fileName;
}
}
//记录上传该文件后的时间
int finaltime = (int) System.currentTimeMillis();
System.out.println(finaltime - pre);
}
}
FileUploadResponse uploadResponse = new FileUploadResponse();
uploadResponse.setFilePath(fileHttpPath);
return uploadResponse;
}
五、
下一篇的地址为Java上传下载完全解析(二) ,会讲Java Web中文件的下载与文件位置配置信息在开发与生产环境中的切换方法。
另外此项目的github地址为FileService,里面会有上面源码中没有的一些工具类,欢迎大家下载,如果感觉有帮助的话,也可以star一下哦。