日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文件上传下载—servlet API实现

發(fā)布時間:2024/4/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件上传下载—servlet API实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

servlet API實現(xiàn)文件上傳下載需要的jar包:

UploadServlet.java

package com.ymw.web.servlet;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; 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.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** @ClassName: UploadHandleServlet* @Description: TODO* @author: lmb* */ public class UploadHandleServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 得到上傳文件的保存目錄,將上傳的文件存放于WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全String savePath = this.getServletContext().getRealPath("/images");// 上傳時生成的臨時文件保存目錄String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");File tmpFile = new File(tempPath);if (!tmpFile.exists()) {// 創(chuàng)建臨時目錄tmpFile.mkdir();}// 消息提示String message = "";try {// 使用Apache文件上傳組件處理文件上傳步驟:// 1、創(chuàng)建一個DiskFileItemFactory工廠DiskFileItemFactory factory = new DiskFileItemFactory();// 設(shè)置工廠的緩沖區(qū)的大小,當(dāng)上傳的文件大小超過緩沖區(qū)的大小時,就會生成一個臨時文件存放到指定的臨時目錄當(dāng)中。factory.setSizeThreshold(1024 * 100);// 設(shè)置緩沖區(qū)的大小為100KB,如果不指定,那么緩沖區(qū)的大小默認(rèn)是10KB// 設(shè)置上傳時生成的臨時文件的保存目錄factory.setRepository(tmpFile);// 2、創(chuàng)建一個文件上傳解析器ServletFileUpload upload = new ServletFileUpload(factory);// 監(jiān)聽文件上傳進(jìn)度upload.setProgressListener(new ProgressListener() {public void update(long pBytesRead, long pContentLength,int arg2) {System.out.println("文件大小為:" + pContentLength + ",當(dāng)前已處理:"+ pBytesRead);/*** 文件大小為:14608,當(dāng)前已處理:4096 文件大小為:14608,當(dāng)前已處理:7367* 文件大小為:14608,當(dāng)前已處理:11419 文件大小為:14608,當(dāng)前已處理:14608*/}});// 解決上傳文件名的中文亂碼upload.setHeaderEncoding("UTF-8");// 3、判斷提交上來的數(shù)據(jù)是否是上傳表單的數(shù)據(jù)if (!ServletFileUpload.isMultipartContent(request)) {// 按照傳統(tǒng)方式獲取數(shù)據(jù)return;}// 設(shè)置上傳單個文件的大小的最大值,目前是設(shè)置為1024*1024字節(jié),也就是1MBupload.setFileSizeMax(1024 * 1024);// 設(shè)置上傳文件總量的最大值,最大值=同時上傳的多個文件的大小的最大值的和,目前設(shè)置為10MBupload.setSizeMax(1024 * 1024 * 10);// 4、使用ServletFileUpload解析器解析上傳數(shù)據(jù),解析結(jié)果返回的是一個List<FileItem>集合,每一個FileItem對應(yīng)一個Form表單的輸入項List<FileItem> list = upload.parseRequest(request);for (FileItem item : list) {// 如果fileitem中封裝的是普通輸入項的數(shù)據(jù)if (item.isFormField()) {String name = item.getFieldName();// 解決普通輸入項的數(shù)據(jù)的中文亂碼問題String value = item.getString("UTF-8");// value = new String(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name + "=" + value);} else {// 如果fileitem中封裝的是上傳文件// 得到上傳的文件名稱,String filename = item.getName();System.out.println(filename);request.setAttribute("filename", filename);if (filename == null || filename.trim().equals("")) {continue;}// 注意:不同的瀏覽器提交的文件名是不一樣的,有些瀏覽器提交上來的文件名是帶有路徑的,如:// c:\a\b\1.txt,而有些只是單純的文件名,如:1.txt// 處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分filename = filename.substring(filename.lastIndexOf("\\") + 1);// 得到上傳文件的擴(kuò)展名String fileExtName = filename.substring(filename.lastIndexOf(".") + 1);// 如果需要限制上傳的文件類型,那么可以通過文件的擴(kuò)展名來判斷上傳的文件類型是否合法System.out.println("上傳的文件的擴(kuò)展名是:" + fileExtName);// 獲取item中的上傳文件的輸入流InputStream in = item.getInputStream();// 得到文件保存的名稱String saveFilename = makeFileName(filename);// 得到文件的保存目錄String realSavePath = makePath(saveFilename, savePath);// 創(chuàng)建一個文件輸出流FileOutputStream out = new FileOutputStream(realSavePath+ "\\" + saveFilename);// 創(chuàng)建一個緩沖區(qū)byte buffer[] = new byte[1024];// 判斷輸入流中的數(shù)據(jù)是否已經(jīng)讀完的標(biāo)識int len = 0;// 循環(huán)將輸入流讀入到緩沖區(qū)當(dāng)中,(len=in.read(buffer))>0就表示in里面還有數(shù)據(jù)while ((len = in.read(buffer)) > 0) {// 使用FileOutputStream輸出流將緩沖區(qū)的數(shù)據(jù)寫入到指定的目錄(savePath + "\\"// + filename)當(dāng)中out.write(buffer, 0, len);}// 關(guān)閉輸入流in.close();// 關(guān)閉輸出流out.close();// 刪除處理文件上傳時生成的臨時文件// item.delete();message = "文件上傳成功!";}}} catch (FileUploadBase.FileSizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "單個文件超出最大值!!!");request.getRequestDispatcher("/addproduct.jsp").forward(request,response);return;} catch (FileUploadBase.SizeLimitExceededException e) {e.printStackTrace();request.setAttribute("message", "上傳文件的總的大小超出限制的最大值!!!");request.getRequestDispatcher("/addproduct.jsp").forward(request,response);return;} catch (Exception e) {message = "文件上傳失敗!";e.printStackTrace();}request.setAttribute("message", message);request.getRequestDispatcher("/addproduct.jsp").forward(request,response);}/*** @Method: makeFileName* @Description: 生成上傳文件的文件名,文件名以:uuid+"_"+文件的原始名稱* @Anthor:lmb* @param filename* 文件的原始名稱* @return uuid+"_"+文件的原始名稱*/private String makeFileName(String filename) { // 2.jpg// 為防止文件覆蓋的現(xiàn)象發(fā)生,要為上傳文件產(chǎn)生一個唯一的文件名return UUID.randomUUID().toString() + "_" + filename;}/*** 為防止一個目錄下面出現(xiàn)太多文件,要使用hash算法打散存儲* * @Method: makePath* @Description:* @Anthor:lmb* * @param filename* 文件名,要根據(jù)文件名生成存儲目錄* @param savePath* 文件存儲路徑* @return 新的存儲目錄*/private String makePath(String filename, String savePath) {// 得到文件名的hashCode的值,得到的就是filename這個字符串對象在內(nèi)存中的地址int hashcode = filename.hashCode();int dir1 = hashcode & 0xf; // 0--15int dir2 = (hashcode & 0xf0) >> 4; // 0-15// 構(gòu)造新的保存目錄String dir = savePath + "\\" + dir1 + "\\" + dir2; // upload\2\3// upload\3\5// File既可以代表文件也可以代表目錄File file = new File(dir);// 如果目錄不存在if (!file.exists()) {// 創(chuàng)建目錄file.mkdirs();}return dir;}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);} }

upload.jsp(在該頁面進(jìn)行文件上傳)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML> <html><head><title>文件上傳</title></head><body><form action="upload.do" enctype="multipart/form-data" method="post"><h2>請選擇您需要上傳的圖片:</h2><input type="file" name="file1"><br><br><input type="submit" value="提交"></form></body> </html>

web.xml中的配置:

<servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name><servlet-name>UploadServlet</servlet-name><servlet-class>com.ymw.web.servlet.UploadServlet</servlet-class></servlet><servlet-mapping><servlet-name>UploadServlet</servlet-name><url-pattern>/upload.do</url-pattern></servlet-mapping>

uploadResult.jsp(在該頁面顯示上傳結(jié)果)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>uploadResult page</title></head><body>${ message }<br/><br/>文件路徑:/images/${filename }</body> </html>

注意:

要想在前臺頁面獲得filename和message,后臺的上傳處理中一定要有

request.setAttribute("filename", filename); request.setAttribute("message", message);

總結(jié)

以上是生活随笔為你收集整理的文件上传下载—servlet API实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。