1. 程式人生 > >檔案的上傳與下載程式碼

檔案的上傳與下載程式碼

檔案上傳程式碼

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.UUID;

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 UploadServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // request.setCharacterEncoding("UTF-8"); // 要執行檔案上傳的操作 // 判斷表單是否支援檔案上傳。即:enctype="multipart/form-data"
boolean isMultipartContent = ServletFileUpload .isMultipartContent(request); if (!isMultipartContent) { throw new RuntimeException("your form is not multipart/form-data"); } // 建立一個DiskFileItemfactory工廠類 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(new File("f:\\"));// 指定臨時檔案的儲存目錄 // 建立一個ServletFileUpload核心物件 ServletFileUpload sfu = new ServletFileUpload(factory); // 解決上傳表單項亂碼問題 sfu.setHeaderEncoding("UTF-8"); // 限制上傳檔案的大小 // 解析request物件,並得到一個表單項的集合 try { // sfu.setFileSizeMax(1024*1024*3);//表示3M大小 List<FileItem> fileItems = sfu.parseRequest(request); // 遍歷表單項資料 for (FileItem fileitem : fileItems) { if (fileitem.isFormField()) { // 普通表單項 processFormField(fileitem); } else { // 上傳表單項 processUploadField(fileitem); } } } catch (FileUploadBase.FileSizeLimitExceededException e) { // throw new RuntimeException("檔案過在,不能超過3M"); System.out.println("檔案過在,不能超過3M"); } catch (FileUploadBase.SizeLimitExceededException e) { System.out.println("總檔案大小不能超過6M"); } catch (FileUploadException e) { e.printStackTrace(); } } private void processUploadField(FileItem fileitem) { try { // 得到檔案輸入流 InputStream is = fileitem.getInputStream(); // 建立一個檔案存檔的目錄 String directoryRealPath = this.getServletContext().getRealPath( "/WEB-INF/upload"); File storeDirectory = new File(directoryRealPath);// 即代表檔案又代表目錄 if (!storeDirectory.exists()) { storeDirectory.mkdirs();// 建立一個指定的目錄 } // 得到上傳的名子 String filename = fileitem.getName();// 檔案項中的值 F:\**\**\ if (filename != null) { // filename = // filename.substring(filename.lastIndexOf(File.separator)+1); filename = FilenameUtils.getName(filename);// 效果同上 } // 解決檔案同名的問題 filename = UUID.randomUUID() + "_" + filename; // 目錄打散 // String childDirectory = makeChildDirectory(storeDirectory); // // 2015-10-19 String childDirectory = makeChildDirectory(storeDirectory, filename); // a/b // 上傳檔案,自動刪除臨時檔案 fileitem.write(new File(storeDirectory, childDirectory + File.separator + filename)); fileitem.delete(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } // 上傳表單項 private void processUploadField1(FileItem fileitem) { try { // 得到檔案輸入流 InputStream is = fileitem.getInputStream(); // 建立一個檔案存檔的目錄 String directoryRealPath = this.getServletContext().getRealPath( "/WEB-INF/upload"); File storeDirectory = new File(directoryRealPath);// 即代表檔案又代表目錄 if (!storeDirectory.exists()) { storeDirectory.mkdirs();// 建立一個指定的目錄 } // 得到上傳的名子 String filename = fileitem.getName();// // 處理檔名 /* * 解決此問題: F:\\apache-tomcat-7.0.52\\webapps\\**\\upload\\F:\\** */ if (filename != null) { // filename = // filename.substring(filename.lastIndexOf(File.separator)+1); filename = FilenameUtils.getName(filename);// 效果同上 } // 解決檔案同名的問題 filename = UUID.randomUUID() + "_" + filename; // 目錄打散 // String childDirectory = makeChildDirectory(storeDirectory); // // 2015-10-19 String childDirectory = makeChildDirectory(storeDirectory, filename); // 2015-10-19 // 在storeDirectory下,建立完整目錄下的檔案 File file = new File(storeDirectory, childDirectory + File.separator + filename); // 絕對目錄/日期目錄/檔名 // 通過檔案輸出流將上傳的檔案儲存到磁碟 FileOutputStream fos = new FileOutputStream(file); int len = 0; byte[] b = new byte[1024]; while ((len = is.read(b)) != -1) { fos.write(b, 0, len); } //關閉流 fos.close(); is.close(); fileitem.delete(); } catch (IOException e) { e.printStackTrace(); } } // 目錄打散 private String makeChildDirectory(File storeDirectory, String filename) { int hashcode = filename.hashCode();// 返回字元轉換的32位hashcode碼 System.out.println(hashcode); String code = Integer.toHexString(hashcode); // 把hashcode轉換為16進位制的字元 // abdsaf2131safsd System.out.println(code); String childDirectory = code.charAt(0) + File.separator + code.charAt(1); // a/b // 建立指定目錄 File file = new File(storeDirectory, childDirectory); if (!file.exists()) { file.mkdirs(); } return childDirectory; } // 按日期打散 /* * private String makeChildDirectory(File storeDirectory) { * * SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd"); String * dateDirectory = sdf.format(new Date()); //只管建立目錄 File file = new * File(storeDirectory,dateDirectory); if(!file.exists()){ file.mkdirs(); } * * return dateDirectory; } */ // 普通表單項 private void processFormField(FileItem fileitem) { try { String fieldname = fileitem.getFieldName();// 欄位名 String fieldvalue = fileitem.getString("UTF-8");// 欄位值 //fieldvalue = new String(fieldvalue.getBytes("iso-8859-1"),"utf-8"); System.out.println(fieldname + "=" + fieldvalue); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

檔案上傳注意問題

  1. 設定上傳檔案的大小問題;
  2. 判斷上傳檔案型別,如果是可執行檔案等是非常危險的;
  3. 如果系統較大,上傳的檔案比較多,注意要多分一下目錄(按時間等),解決可能上傳檔案同名情況,以及上傳檔案的儲存路徑
  4. 注意設定編碼問題,form表單中要有上傳的屬性,才能上傳。

檔案下載程式碼

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
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 DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //設定一個要下載的檔案
        String filename = "電器";

        //設定檔名的編碼
        if(request.getHeader("user-agent").toLowerCase().contains("msie")){
            filename = URLEncoder.encode(filename, "UTF-8");//將不安全的檔名改為UTF-8格式
        }else{
            filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");//火狐瀏覽器
        }
        //告知瀏覽器要下載檔案
        response.setHeader("content-disposition", "attachment;filename="+filename);
        //response.setHeader("content-type", "image/jpeg");
        response.setContentType(this.getServletContext().getMimeType(filename));//根據檔名自動獲得檔案型別

        response.setCharacterEncoding("UTF-8");//告知伺服器使用什麼編碼
        //建立一個檔案輸出流
        PrintWriter out = response.getWriter();
        out.write("電視機,20\n");
        out.write("洗衣機,10\n");
        out.write("冰箱,8\n");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}