javaweb檔案上傳與下載
阿新 • • 發佈:2019-01-31
檔案傳輸的相關設定
- 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>
- 上傳工具類的使用
介紹:
通常兩個包一起用
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")
解釋:
檔案下載
路徑問題
亂碼問題
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"));