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

javaweb檔案上傳與下載

檔案傳輸的相關設定

  • form表單

提交方式: post

enctype屬性的介紹:

Content-Type的型別擴充了multipart/form-data用以支援向伺服器傳送二進位制資料。
因此傳送post請求時候,表單<form>屬性enctype共有二個值可選,
這個屬性管理的是表單的MIME編碼:

    1.application/x-www-form-urlencoded(預設值)
    2.multipart/form-data

enctype預設屬性為:application/x- www-form-urlencoded

例項:

from表單:

<form action="/FileUpLoad/Aservlet" method="post"
        enctype="multipart/form-data">
        使用者名稱:<input type="text" name="name"/><br>
        頭像:   <input type="file" name="photo" /> <br>
        <input type="submit" value="上傳"/>
    </form>

<img src="picture/form.png"/>

  • 上傳工具類的使用

介紹:

通常兩個包一起用
commons-fileupload-1.2.1.jar
commons-io-1.4.jar

在sevlet 中的使用:

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //設定臨時上傳目錄 位置
factory.setRepository(new File("E://temp")); //設定檔案 寫入 硬碟的緩衝區大小 => 預設值 10k factory.setSizeThreshold(10240); //建立解析器 ServletFileUpload upload = new ServletFileUpload(factory); //判斷但錢請求 是否是多端式請求 upload.isMultipartContent(req); //設定多段 中每段 段頭 在解析時,使用神馬編碼解碼 == //=> 當段頭中出現中文時,一定要呼叫該方式指定段頭碼錶 upload.setHeaderEncoding("UTF-8"); upload.setSizeMax(1024*1024*10); //單次請求,總的上傳限制 upload.setFileSizeMax(1024*1024); //每個檔案的上傳段,大小限制 try { fileItems = upload.parseRequest(req); if(fileItems!=null){ for (FileItem item : fileItems) { //是否為普通表單提交 boolean flag = item.isFormField(); //獲取上傳檔案的 檔名 String name = item.getName(); //獲取input 元素 name屬性的值 String fName = item.getFieldName(); //已字串 形式 返回 段體中的內容,注意:檔案上傳不建議使用該方法 // String content = item.getString(); //刪除上傳的臨時檔案 item.delete(); System.out.println("是否是普通表單提交"+flag); } } } catch (FileUploadException e) { e.printStackTrace(); } }

如何將上傳檔案分目錄儲存

1.使用登入使用者的使用者名稱 來建立不同的資料夾. 每個使用者上傳的檔案就放到自己的資料夾中

2.按照日期分目錄=> d:/upload/2015/08/24/
 InputStream is = item.getInputStream();
         SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
         String datePath = sdf.format(new Date());
         String wholePath = "E:/upload"+datePath;

         File dir = new File(wholePath);
         if(!dir.exists()){
             dir.mkdirs();
         }

         FileOutputStream fos = new FileOutputStream(wholePath+UUID.randomUUID().toString());
         IOUtils.copy(is, fos);
         fos.close();

亂碼問題的解決

檔名稱亂碼 :      
Content-Disposition: form-data; name="name" 分段首行 亂碼更正
upload.setHeaderEncoding("UTF-8");

檔案內容亂碼:
item.getString("UTF-8")

解釋:

<img src="picture/uploadmessycode.png"/>

檔案下載

  • 路徑問題

    這裡寫圖片描述

  • 亂碼問題

1.得到表單中的內容有中文(get)

String fileName = req.getParameter("name");
        fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");

2.下載的檔名稱有中文

resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));