文件上传:
1.首先,设计前台页面。
要在form表单中加上 enctype="multipart/form-data"
,指明接收请求的Servlet。
<form action="upload" method="post" enctype="multipart/form-data" >
<span>上传文件</span><input type="file" name="filename" value="上传">
</form>
2.开发后台的Servlet。
2.1 在上传文件的Servlet上打注解:@MultipartConfig
2.2. 获取前台页面选择的文件名。
原理分析:在firebug上看到的文件上传的请求头为:
Content-Type: multipart/form-data; boundary=---------------------------16593218025140
Content-Length: 34211
-----------------------------16593218025140
Content-Disposition: form-data; name="fname"; filename="session (1).png"
Content-Type: image/png
每个文件都是一个Part,以前台的name属性标记,filename="session (1).png"
为上传的文件名。
取出文件名:
request.setCharacterEncoding("utf-8");
Part part = request.getPart("filename");
//获得上传的文件名
String header = part.getHeader("Content-Disposition");
int start = header.lastIndexOf("=");
int end=header.lastIndexOf("\"");
String fname= header.substring(start+2, end);
System.out.println(fname);
如果上传多个文件,Collection<Part> parts = request.getParts();
遍历parts,依次获取文件名。
2.3 将上传的文件存放在指定的路径下。
String path=request.getRealPath("/");//获取部署到tomcat下的文件路径
System.out.println(path);
String filename=path+fname;
part.write(filename);
文件下载:
1.设置响应的文件类型
response.setContentType("application/octet-stream");
2.Response设置响应头Content-Dispostion,指定要下载的文件和下载方式。
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
attachment:表示文件输出流会以附件的方式下载
3.读文件到输入流,写到response对象的输出流中,将数据刷新到磁盘
InputStream in=new FileInputStream(request.getRealPath("/")+fname);
ServletOutputStream out = response.getOutputStream();
byte[] b=new byte[1024];
int len=0;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
//将数据刷新到磁盘
out.flush();