最近在编写基于mvc架构的javaEE代码时,总是想着如何才能够实现对于文件的上传和下载,今天经过一天的努力,终于实现了文件的上传和下载,在这个地方呢也将自己的编写过程总结出来,希望能够对大家有所帮助,对于源代码我也会不断的改进,那个也会上传,希望能够对大家有所帮助
对于我们javaEE程序员来说,其实文件的上传和下载其实很多的大牛都已经编写好了实现的大部分希捷,那么我们只需用编写代码进行事先就可以了,所以我在这个地方也不懂太多深层次的原理,但是如果你是想着只要会用就可以了,那么希望对你有帮助。好了进入正题
一、文件上传原理分析
1、文件上传的前提:(记住)
a、表单的method必须是post
b、表单的enctype属性必须是multipart/form-data
c、表单中提供
2、form表单的enctype属性
该属性的作用是用来告知服务器,请求正文内容的MIME类型的。相当于请求消息头Content-Type。
1、apache的:commons-fileupload组件。
依赖:commons-io组件
下载地址:http://pan.baidu.com/s/1slUxaHn
2、开发主要的步骤
1:
编写文件上传时需要的上传Servlet类
package cn.edu.nwsuaf.utils;
import java.io.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
public class Upload extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决上传文件在存放目录中的乱码问题
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//检测form是否是multipart/form-data类型的
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart){
throw new RuntimeException("The form's enctype attribute value must be multipart/form-data");
}
//解析请求内容
DiskFileItemFactory factory = new DiskFileItemFactory();//产生FileItem的工厂
//指定上传文件的临时文件存放目录,当上传文件的大小大于缓存区的大小就会产生临时存储区
factory.setRepository(new File("d:/"));//指定临时文件的存放目录
ServletFileUpload sfu = new ServletFileUpload(factory);
//如果这两条语句执行的话,那么上传的文件的大小就会受到限制
// 因为此处为了方便,所以没有进行大小的限制
// sfu.setFileSizeMax(3*1024*1024);//单个文件大小限制
// sfu.setSizeMax(5*1024*1024);//总文件大小
List<FileItem> items = new ArrayList<FileItem>();
try {
items = sfu.parseRequest(request);
}catch(FileUploadBase.FileSizeLimitExceededException e) {
response.getWriter().write("单个文件不能超过3M");
}
catch(FileUploadBase.SizeLimitExceededException e) {
response.getWriter().write("总文件不能超过5M");
}catch (FileUploadException e) {
e.printStackTrace();
throw new RuntimeException("解析请求失败");
}
//遍历:
//因为可能存在多个上传文件表单,所以对于每一个表单的内容要进行一一的处理
for(FileItem item:items){
//处理普通字段
if(item.isFormField()){
processFormField(item);
}else{
//处理上传字段
processUploadField(item);
}
}
request.getRequestDispatcher("/homework.jsp").forward(request, response);
}
protected void processUploadField(FileItem item) {
try {
// InputStream in = item.getInputStream();
//找一个存放文件的位置;存放的文件名
String fileName = item.getName();//上传的文件的文件名 C:\Users\wzhting\Desktop\a.txt a.txt(浏览器不同)
if(fileName!=null&&!fileName.equals("")){