天天看點

apache的commons-fileupload實作檔案上傳,下載下傳

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;

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);

    }

}

繼續閱讀