apache的commons-fileupload实现文件上传,下载

时间:2022-11-30 21:00:33

package com.handson.bbs.servlet;

 

import java.io.File;

import java.io.IOException;

import java.util.Date;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

importorg.apache.commons.fileupload.FileItem;

importorg.apache.commons.fileupload.disk.DiskFileItemFactory;

importorg.apache.commons.fileupload.servlet.ServletFileUpload;

import com.handson.bbs.bo.UserBO;

import com.handson.bbs.model.User;

/** *//**

 ***********************************************

 *@description 文件上传

 *                 针对本项目,上传图片在uploadFile/Image

 *                         缓存目录 c:\\tmp\\ 目录下

 *                 照片上传后,后面代码处理及时更新用户照片。

 *@author Gavin.lee

 *@date 2009-6-13 21:35:47

 *@version 1.0

 ***********************************************

 */

public class UploadPhotoServlet extendsHttpServlet{

   public void doGet(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {

       this.doPost(request, response);

       

    }

 

   public void doPost(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException, IOException {       

       String filepath =this.getServletContext().getRealPath("/uploadFile/Image/");    //容器相对路径

       

       File tmp = new File("c:\\tmp\\");

       if(! tmp.exists()) {

           tmp.mkdirs();

       }

       DiskFileItemFactory factory = new DiskFileItemFactory();    //创建磁盘工厂

       factory.setRepository(tmp);    //文件缓存路径

       factory.setSizeThreshold(10 * 1096 );

       ServletFileUpload sfu = new ServletFileUpload(factory);        //创建处理工具

       sfu.setSizeMax(10*1024*1024); //服务器端可以接收的最大文件大小,-1表示无上限

       String filename = null;

       try {

           List<FileItem> list = sfu.parseRequest(request);        //解析

           FileItem item= list.get(0);

            filename = item.getName();

           if(filename.equals("")) {

               request.getRequestDispatcher("/com/visualizePhoto.jsp").forward(request,response);

                return ;

           }           

           int pos = filename.lastIndexOf(".");                    //取图片文件格式

           if(pos > 0) {

                Date date = new Date();

                filename =filepath+'/'+date.getTime()+filename.substring(pos);

           }

           item.write(new File(filename));   //写到磁盘

       } catch(Exception e) {

           e.printStackTrace();

       }

       

       // 只针对文件上传的话,后面代码不用看了,后面是针对及时更新用户信息(照片)

       HttpSession session = request.getSession();

       User user = (User)session.getAttribute("user");       

       int pos = filename.indexOf("uploadFile");    //设置图片相对路径

       if(pos > 0) {

           filename =filename.substring(pos,pos+10)+'/'+filename.substring(pos+11);

       }

       user.setPhoto(filename);

       

       UserBO userBo = UserBO.getInstance();

       if(userBo.updateUser(user)){

           session.setAttribute("user", user);

           request.getRequestDispatcher("/com/visualizePhoto.jsp").forward(request,response);

       }

    }

 

}

 

【download】

下载似乎就更简单了, packagecom.Gavin.tools.fileupload;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

public class FileDownloadServlet extendsHttpServlet {

 

   public void doPost(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException {

       String filename = request.getParameter("file_name");

       

       if (filename == null)

           filename = "";

       

        filename = filename.trim();

 

       InputStream inStream = null;

       String attchname = "";

 

       byte[] b = new byte[100];

       int len = 0;

       try {           

           attchname = getAttachName(filename);   //取得附件的名称

           filename =getRealName(request, filename);    //取得附件的全路径

           

           if (filename == null) {

                System.out.println("文件不存在,或者禁止下载");

                return;

           }

           attchname = toUtf8String(attchname);   //将文件转码 UTF-8

           inStream = new FileInputStream(filename);

           response.reset();    //必须reset,否则会出现文件不完整

           

           response.setContentType("application/x-msdownload");

           response.addHeader("Content-Disposition", "attachment;filename=\""    + attchname +"\"");

           

           //循环取出流中的数据

           while ((len = inStream.read(b)) > 0) {

               response.getOutputStream().write(b, 0, len);

            }

           inStream.close();

           

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

 

   //取得附件的名称

   public static String getAttachName(String filename) {

       if (filename == null)

           return "";

       filename = filename.trim();

       int pos = 0;

       

       pos = filename.lastIndexOf("\\");       

       if (pos > -1) {

           filename = filename.substring(pos + 1);

       }       

       

       pos = filename.lastIndexOf("/");       

       if (pos > -1) {

           filename = filename.substring(pos + 1);

       }

       

       pos = filename.lastIndexOf(File.separator);       

       if (pos > -1) {

           filename = filename.substring(pos + 1);

       }

       

       return filename;

    }

 

   //UTF8转码

   public static String toUtf8String(String string) {

       StringBuffer sb = new StringBuffer();

       for (int i = 0; i < string.length(); i++) {

           char c = string.charAt(i);

           if (c >= 0 && c <= 255) {

                sb.append(c);

           } else {

                byte[] b;

                try {

                    b =Character.toString(c).getBytes("utf-8");

                } catch (Exception ex) {

                   System.out.println(ex);

                    b = new byte[0];

                }

                for (int j = 0; j <b.length; j++) {

                    int k = b[j];

                    if (k < 0)

                        k += 256;

                    sb.append("%" +Integer.toHexString(k).toUpperCase());

                }

           }

       }

       String s_utf8 = sb.toString();

       sb.delete(0, sb.length());

       sb.setLength(0);

       sb = null;

       return s_utf8;

    }

 

   //取得下载文件的真实全路径名称

   private String getRealName(HttpServletRequest request, String filename){

       if (request == null || filename == null)

           return null;

       filename = filename.trim();

       if (filename.equals(""))

            return null;

 

       String filepath = request.getRealPath(filename);

       if (filepath == null)

           return null;

       File file = new File(filepath);

       if (!file.exists())

           return null;

       return filepath;

    }

 

   public void doGet(HttpServletRequest request, HttpServletResponseresponse)

           throws ServletException {       

       this.doPost(request, response);

    }

 

}