文件上传一直是Web项目中必不可少的一项功能。
项目结构如下:(这是我之前创建的SSM整合的框架项目,在这上面添加文件上传与下载)
主要的是FileUploadController,doupload.jsp,up.jsp,springmvc.xml
1.先编写up.jsp
<form action="doupload.jsp" enctype="multipart/form-data" method="post">
<p>上传者:<input type="text" name="user"></p>
<p>选择文件:<input type="file" name="nfile"></p>
<p>选择文件:<input type="file" name="nfile1"></p>
<p><input type="submit" value="提交"></p>
</form>
以上便是up.jsp的核心代码;
2.编写doupload.jsp
<%
request.setCharacterEncoding("utf-8");
String uploadFileName = ""; //上传的文件名
String fieldName = ""; //表单字段元素的name属性值
//请求信息中的内容是否是multipart类型
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//上传文件的存储路径(服务器文件系统上的绝对文件路径)
String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/" );
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//解析form表单中所有文件
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) { //依次处理每个文件
FileItem item = (FileItem) iter.next();
if (item.isFormField()){ //普通表单字段
fieldName = item.getFieldName(); //表单字段的name属性值
if (fieldName.equals("user")){
//输出表单字段的值
out.print(item.getString("UTF-8")+"上传了文件。<br/>");
}
}else{ //文件表单字段
String fileName = item.getName();
if (fileName != null && !fileName.equals("")) {
File fullFile = new File(item.getName());
File saveFile = new File(uploadFilePath, fullFile.getName());
item.write(saveFile);
uploadFileName = fullFile.getName();
out.print("上传成功后的文件名是:"+uploadFileName);
out.print("\t\t下载链接:"+"<a href='download.action?name="+uploadFileName+"'>"+uploadFileName+"</a>");
out.print("<br/>");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
%>
该页面主要是内容是,通过解析request,并设置上传路径,创建一个迭代器,先进行判空,再通过循环来实现多个文件的上传,再输出文件信息的同时打印文件下载路径。
效果图:
3.编写FilterController实现文件下载的功能(相对上传比较简单):
@Controller
public class FileUploadController {
@RequestMapping(value="/download")
public ResponseEntity<byte[]> download(HttpServletRequest request,HttpServletResponse response,@RequestParam("name") String filename)throws Exception {
//下载显示的文件名,解决中文名称乱码问题
filename=new String(filename.getBytes("iso-8859-1"),"UTF-8");
//下载文件路径
String path = request.getServletContext().getRealPath("/upload/");
File file = new File(path + File.separator + filename);
HttpHeaders headers = new HttpHeaders();
//下载显示的文件名,解决中文名称乱码问题
String downloadFielName = new String(filename.getBytes("iso-8859-1"),"UTF-8");
//通知浏览器以attachment(下载方式)打开图片
headers.setContentDispositionFormData("Content-Disposition", downloadFielName);
//application/octet-stream : 二进制流数据(最常见的文件下载)。
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers, HttpStatus.CREATED);
}
}
4.实现上传文件的功能还需要在springmvc中配置bean:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件大小上限,单位为字节(10MB) -->
<property name="maxUploadSize">
<value>10485760</value>
</property>
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
完整代码如下:
up.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>File控件</title>
</head>
<body>
<form action="doupload.jsp" enctype="multipart/form-data" method="post">
<p>上传者:<input type="text" name="user"></p>
<p>选择文件:<input type="file" name="nfile"></p>
<p>选择文件:<input type="file" name="nfile1"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>