------------------------------------------------------------文件上传和下载文件

1.-文件上传

package cn.bdqn.servlet;

import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.bdqn.bean.Datail;
import cn.bdqn.seriver.DatailSeriver;
import cn.bdqn.seriverImpl.DatailSeriverImpl;

public class AddServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         + * 文件新增   ===》上传
         + * 
         + * 分析:
         + *01.form表单提交的时候  有文件!enctype="multipart/form-data"
         + *02.针对与文件上传 我们需要引入2个jar
         + *   fileupload 文件上传的jar   依赖于  io.jar
         + *03.我们的form表单中  不只是有文件,还有 普通的 文本输入框
         + *   这时候 我们能  按照同一种方式 进行处理吗???  No!
         + *04.是文件 我们按照文件的方式 处理  
         + *     001.我们怎么知道用户的请求是文件上传类型?
         + *       ServletFileUpload中有一个isMultipartContent(HttpServletRequest)方法
         + *         根据用户的请求  我们可以判断  是否是文件上传类型的请求! 返回 boolean
         + *       
         + *       ServletFileUpload中还有一个重要的方法parseRequest(HttpServletRequest)
         + *        根据用户的请求,会把我们form表单中的每一项(不管是文件还是普通文本都封装成了
         + *        一个FileItem对象,这个方法返回一个所有FileItem的List集合
         + *       
         + *     002.怎么处理文件?
         + *      FileItem 接口 
         + *          中有一系列的方法   可以解析是否是文件还是普通文本!
         + *           getInputStream() 把上传文件加载到内存中                                       输入流
         + *           getOutputStream() 把内存中的数据写入到服务器的文件中                输出流
         + *           
         + *           如果是文件类型,想获取文件名使用 getName()
         + *           如果是普通文本,想获取字段名使用 getFieldName()
         + *          
         + *           怎么知道 是文件 还是 普通字段??
         + *            有一个方法 isFormField()  返回boolean
         + *            true :普通字段
         + *            false:文件
         + *        
         + *       DiskFileItemFactory 核心的实现类  
         + *           可以设置我们缓冲区的大小 setSizeThreshold(int sizeThreshold)  1024*1024          默认大小 10kb
         + *           设置文件临时存放的位置    setRepository(File repository)    new  File("e:	emp")    默认路径System.getProperty("java.io.temdir")
         + *    
         + *   是普通的文本输入框   我们按照普通的方式 处理  
         + *   
         + *   
         + *  实现文件上传的步骤:
         + *  01.创建DiskFileItemFactory对象 设置缓冲区的大小  存放的位置  ,可以不设置 有默认值
         + *  02.通过DiskFileItemFactory对象 创建出 ServletFileUpload  ,就可以知道我们的请求是否是文件上传类型
         + *  03.通过ServletFileUpload对象的  parseRequest方法 获取List<FileItem>
         + *  04.对list集合进行遍历,每遍历一次都要使用FileItem类中的isFormField()来判断是否为文件
         + *      001.普通字段  使用 getFieldName()  和getString() 来获取字段名和字段值
         + *      002.文件   使用getInputStream  getName  getOutputStream*/
    /*    request.setCharacterEncoding("UTF-8");
        Datail datail=new Datail();
        datail.setAuthor(request.getParameter("author"));
        datail.setTitle(request.getParameter("title"));
        datail.setContent(request.getParameter("content"));
        datail.setCreateDate(new Date());
        datail.setPicPath(request.getParameter("picPath"));
        datail.setSummary(request.getParameter("summary"));
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
        try {
            datail.setCreateDate(df.parse(request.getParameter("createDate")));
        } catch (ParseException e) {
            System.err.println("日期格式不正确");
        }
        
        
        DatailSeriver datailSeriver=new DatailSeriverImpl();
        boolean flag = datailSeriver.addDatail(datail);
        if (flag) {
            
            request.getRequestDispatcher("ListServlet").forward(request, response);
        }*/
        
        System.out.println("临时文件的位置"+System.getProperty("java.io.temdir"));
        //因为新增新闻  需要一个新闻对象
        Datail datail=new Datail();
        //01.创建DiskFileItemFactory对象
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //02.通过DiskFileItemFactory对象 创建ServletFileUpload
        ServletFileUpload upload=new ServletFileUpload(factory);
        //判断是不是 文件上传请求
        boolean flag = upload.isMultipartContent(request);
        if (flag) {
            //03.通过ServletFileUpload对象的parseReequest方法获取Lisi<FileItem>
            try {
                List<FileItem> items = upload.parseRequest(request);
                //对集合进行遍历 每一次都要使用FileItem类中的isFormFiled()来判断是不是文件
                Iterator<FileItem> its = items.iterator();
                while (its.hasNext()) {
                    //获取每一项
                    FileItem item = its.next();
                    if (item.isFormField()) {//普通字段
                        //001.普通字段 使用getFiledName()和getString()来获取字段名和字段值
                        String fieldName = item.getFieldName();
                        if (fieldName.equals("title")) {
                            datail.setTitle(item.getString("UTF-8"));
                        }else if (fieldName.equals("author")) {
                            datail.setAuthor(item.getString("UTF-8"));
                        }else if (fieldName.equals("summary")) {
                            datail.setSummary(item.getString("UTF-8"));
                        }else if (fieldName.equals("createDate")) {
                            datail.setCreateDate(new SimpleDateFormat("MM/dd/yyyy").parse(item.getString("UTF-8")));
                        }else if (fieldName.equals("content")) {
                            datail.setContent(item.getString("UTF-8"));
                        }else if (fieldName.equals("categoryId")) {
                            datail.setCategoryId(Integer.parseInt(item.getString("UTF-8")));
                        }
                    }else {//文件上传
                        //指定文件上传的位置getServletContext 获取的是项目在服务器的位置==》
                        String uploadPath = request.getSession().getServletContext().getRealPath("upload/");
                        File file=new File(uploadPath) ;
                        if (!file.exists()) {//不存在我们创建
                            file.mkdirs();
                        }
                        String fileName  = item.getName();//文件名称
                        if (!fileName .equals("")&&fileName!=null) {//判断用户是否选择了文件上传
                            File uploadFile=new File(fileName);//上传的文件
                            File saveFile=new File(uploadPath, uploadFile.getName());
                            //真正的输出
                            item.write(saveFile);
                            datail.setPicPath(uploadFile.getName());
                        }
                    }
                    
                }
                DatailSeriver datailSeriver=new DatailSeriverImpl();
                boolean flag1 = datailSeriver.addDatail(datail);
                
                if (flag1) {
                    request.getRequestDispatcher("ListServlet").forward(request, response);
                }else {
                    response.sendRedirect("/FindCategoryServlet");
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        
        
        }
        
        
    }
    
    
}

1.-把上传的文件下载到客户端

package cn.bdqn.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UploadServlet  extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    @SuppressWarnings("null")
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
           request.setCharacterEncoding("utf-8");
           //获取文件名
           String picPath = request.getParameter("picPath");
        if (picPath!=null||"".equals(picPath.trim())) {
            //获取文件在服务器的目录
           String uploadPath = request.getSession().getServletContext().getRealPath("upload/");
          //拼接真实文件地址
           File saveFile=new File(uploadPath, picPath);
           
           if(saveFile.exists()){  
                FileInputStream  fis = new FileInputStream(saveFile); 
                
                String filename=URLEncoder.encode(saveFile.getName(),"utf-8"); //解决中文文件名下载后乱码的问题  
                byte[] b = new byte[fis.available()];  
                fis.read(b);  
                response.setCharacterEncoding("utf-8");  
                response.setHeader("Content-Disposition","attachment; filename="+filename+"");  
                //获取响应输出流对象  
                ServletOutputStream  out =response.getOutputStream();  
                //输出  
                out.write(b);  
                out.flush();  
                out.close(); 
                request.getRequestDispatcher("ListServlet").forward(request, response);
            } else{
                //如果文件不存在
                request.getRequestDispatcher("ListServlet").forward(request, response);
            }    
              
        }else {
            request.getRequestDispatcher("ListServlet").forward(request, response);
        }
    }   
           
    
    
}
原文地址:https://www.cnblogs.com/laosunlaiye/p/7327539.html