在开发当中很多时候要用到文件上传,上传的时候可能会一次上传多个文件,并且还要保证上传的文件的文件名和文件类型都不变。我采用的spring的上传文件方式。
文件上传要引入两个jar包
文件上传部分
在spring的配置文件中要增加以下部分:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置上传文件的最大值,现在是200M-->
<property name="maxUploadSize" value="204800"/>
</bean>
由于Post一个包含文件上传的Form会以multipart/form-data请求发送给服务器,必须明确告诉DispatcherServlet如何处理MultipartRequest。这样一旦某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,然后再转发相应的Controller。
接着在Controller中就可以将HttpServletRequest转型为MultipartHttpServletRequest,就能非常方便地得到文件名和文件内容。但是要注意,文件的上传和下载都是要转换成iso8859-1的编码形式进行的,所以获取到的时候要从iso8859-1的形式转换为其他形式,要不然中文的文件名就会乱码。
public void fileUpload(HttpServletRequest request, HttpServletResponse response) throws Exception{
MultipartHttpServletRequest multipart = (MultipartHttpServletRequest)request;
List<MultipartFile> fileList = multipart.getFiles("file");
for(MultipartFile file : fileList) {
//获取文件全名
String fileFullName = file.getOriginalFilename();
//获取后缀名
String suffixName = fileFullName.substring(fileFullName.lastIndexOf("."));
String firstName = fileFullName.substring(0, fileFullName.lastIndexOf("."));
//对文件名进行转码,不转码中文会乱码
firstName = new String(firstName.getBytes("iso8859-1"), "utf-8");
String pathFileName = "E:" + File.separator + "TDDOWNLOAD" + File.separator + firstName + suffixName;
InputStream input = file.getInputStream();
FileOutputStream fos = new FileOutputStream(pathFileName);
int i = input.read();
while(i != -1) {
fos.write(i);
i = input.read();
}
input.close();
fos.close();
}
}
对应的jsp部分:
<div>
<form action="index/fileUpload.do" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="file" name="file"/>
<input type="submit" value="submit"/>
</form>
</div>
这里的form要加上enctype="multipart/form-data"才能完成传输。
文件下载
文件的下载中,如果要下载的文件可能包含中文名的话,就要进行对应的转码,在浏览器端是使用iso8859-1的编码方式,所以要转成这种方式。
public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
String path = "E:" + File.separator + "TDDOWNLOAD" + File.separator + "直接硬盘安装原版Win7系统图解全过程.doc";
//对中文的文件名进行转码,不然会乱码
String fileName = new String("直接硬盘安装原版Win7系统图解全过程.doc".getBytes("utf-8"), "iso8859-1");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
response.setContentType("application/x-download");
response.setCharacterEncoding("UTF-8");
InputStream input = new FileInputStream(new File(path));
OutputStream out = response.getOutputStream();
byte[] b = new byte[1024];
int length;
while((length = input.read(b)) > 0) {
out.write(b, 0, length);
}
input.close();
out.close();
}
对应的jsp:
<a href="index/download.do">下载</a>