后台(27)——文件上传
探索Android軟鍵盤(pán)的疑難雜癥
深入探討Android異步精髓Handler
詳解Android主流框架不可或缺的基石
站在源碼的肩膀上全解Scroller工作機(jī)制
Android多分辨率適配框架(1)— 核心基礎(chǔ)
Android多分辨率適配框架(2)— 原理剖析
Android多分辨率適配框架(3)— 使用指南
自定義View系列教程00–推翻自己和過(guò)往,重學(xué)自定義View
自定義View系列教程01–常用工具介紹
自定義View系列教程02–onMeasure源碼詳盡分析
自定義View系列教程03–onLayout源碼詳盡分析
自定義View系列教程04–Draw源碼分析及其實(shí)踐
自定義View系列教程05–示例分析
自定義View系列教程06–詳解View的Touch事件處理
自定義View系列教程07–詳解ViewGroup分發(fā)Touch事件
自定義View系列教程08–滑動(dòng)沖突的產(chǎn)生及其處理
版權(quán)聲明
- 本文原創(chuàng)作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
文件上傳概述
文件上傳通常指的是用戶在瀏覽器中通過(guò)表單form將文件上傳至服務(wù)端
但是請(qǐng)注意該表單必須滿足如下三個(gè)條件:
- form的method必須是post
- form的enctype必須是multipart/form-data
- form中利用input type=”file”提供上傳的入口
Commons-fileupload簡(jiǎn)介
Commons-fileupload是Apache提供的一個(gè)用來(lái)處理表單文件上傳的一個(gè)開(kāi)源組件。該組件操作簡(jiǎn)單、API通俗易懂、性能優(yōu)異。
使用Commons-fileupload需要導(dǎo)入兩個(gè)jar包:
- commons-fileupload
- commons-io
Commons-fileupload使用示例
我們先來(lái)準(zhǔn)備一個(gè)表單form
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上傳</title> </head> <body><form enctype="multipart/form-data" action="${pageContext.request.contextPath }/servlet" method="post" >文件描述:<input type="text" name="description"/><br/><br/>選擇文件:<input type="file" name="photo"/><br/><br/><input type="submit" value="上傳"/><br/><br/></form> </body> </html>運(yùn)行后效果如下圖所示:
再來(lái)寫(xiě)一個(gè)處理文件上傳的Servlet
/*** 本文作者:谷哥的小弟* 博客地址:http://blog.csdn.net/lfdfhl*/ package cn.com;import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FilenameUtils;public class UploadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 判斷表單是否支持文件上傳boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);if (isMultipartContent) {DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload servletFileUpload = new ServletFileUpload(factory);servletFileUpload.setHeaderEncoding("UTF-8");try {//得到并處理表單中的每個(gè)項(xiàng)List<FileItem> fileItems = servletFileUpload.parseRequest(request);for (FileItem fileitem : fileItems) {if (fileitem.isFormField()) {processFormField(fileitem);} else {processUploadField(fileitem);}}} catch (Exception e) {e.printStackTrace();}}}// 處理普通表單項(xiàng)private void processFormField(FileItem fileitem) {try {String fieldName = fileitem.getFieldName();String fieldValue = fileitem.getString("UTF-8");System.out.println(fieldName + "=" + fieldValue);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}//處理上傳表單項(xiàng)private void processUploadField(FileItem fileItem) {try {//創(chuàng)建存放上傳文件的目錄String folderName="upload";String folderPath = getServletContext().getRealPath("/WEB-INF/"+folderName);File folder = new File(folderPath);if (!folder.exists()) {folder.mkdirs();}//生成不重復(fù)的文件名String fileName = fileItem.getName();if (fileName != null) {fileName = FilenameUtils.getName(fileName);}fileName = UUID.randomUUID() + "_" + fileName;//按照日期生成子文件名稱String dateDirectory = makeDateDirectory(folder);//存放被上傳的文件File file=new File(folder, dateDirectory + File.separator + fileName);fileItem.write(file);} catch (Exception e) {e.printStackTrace();}}//依據(jù)日期生成子文件夾private String makeDateDirectory(File folder) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date=new Date();String dateDirectory = simpleDateFormat.format(date); File file = new File(folder, dateDirectory);if (!file.exists()) {file.mkdirs();}return dateDirectory;} }嗯哼,鑒于該示例比較簡(jiǎn)單和代碼里已有的注釋,在此不再對(duì)代碼作詳解。
文件上傳的注意事項(xiàng)
實(shí)際開(kāi)發(fā)中,在處理文件上傳時(shí)請(qǐng)注意以下問(wèn)題:
- 將保存上傳文件的目錄放在用戶直接訪問(wèn)不到的地方,比如WEB-INF
- 上傳文件重名的處理,可用UUID+文件名的方式
- 將上傳文件合理地存入子目錄中,比如按照日期
- 限制上傳文件的大小,比如3M
總結(jié)
以上是生活随笔為你收集整理的后台(27)——文件上传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android studio 项目迁移
- 下一篇: git 学习之基础知识