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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

servlet上传下载(任何格式的都可以)

發布時間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 servlet上传下载(任何格式的都可以) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jar不能低于此版本,JDK1.6以上,否則戶報錯

  • <dependency>
  • <groupId>commons-fileupload</groupId>
  • <artifactId>commons-fileupload</artifactId>
  • <version>1.3.1</version>
  • </dependency>
  • 一、上傳文件
  • package com.odj.common.upload;
  • import java.io.File;
  • import java.io.FileOutputStream;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.util.List;
  • 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;
  • public class UploadHandleServlet extends HttpServlet {
  • /**
  • *
  • */
  • private static final long serialVersionUID = 1L;
  • public void doGet(HttpServletRequest request, HttpServletResponse response)
  • throws ServletException, IOException {
  • doPost(request, response);
  • }
  • /**
  • * @Method: makeFileName *
  • * @Description: 生成上傳文件的文件名,文件名以:uuid+"_"+文件的原始名稱
  • * @param filename 文件的原始名稱 *
  • * @return uuid+"_"+文件的原始名稱
  • */
  • private String makeFileName(String filename) {
  • // 2.jpg
  • // 為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名
  • //return UUID.randomUUID().toString() + "_" + filename;
  • int i = 1;
  • String s = i + "_" + filename;
  • i++;
  • return s;
  • }
  • /**
  • * 為防止一個目錄下面出現太多文件,要使用hash算法打散存儲
  • * @Method: makePath
  • * @param filename 文件名,要根據文件名生成存儲目錄
  • * @param savePath 文件存儲路徑
  • * @return 新的存儲目錄
  • */
  • private String makePath(String filename, String savePath) {
  • // 得到文件名的hashCode的值,得到的就是filename這個字符串對象在內存中的地址
  • int hashcode = filename.hashCode();
  • int dir1 = hashcode & 0xf; // 0--15
  • int dir2 = (hashcode & 0xf0) >> 4; // 0-15
  • // 構造新的保存目錄
  • //String dir = savePath + "\\" + dir1 + "\\" + dir2;
  • String dir = savePath;
  • // upload\2\3 upload\3\5
  • // File既可以代表文件也可以代表目錄
  • File file = new File(dir);
  • // 如果目錄不存在
  • if (!file.exists()) {
  • // 創建目錄
  • file.mkdirs();
  • }
  • return dir;
  • }
  • public void doPost(HttpServletRequest request, HttpServletResponse response)
  • throws ServletException, IOException {
  • // 得到上傳文件的保存目錄,將上傳的文件存放于WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全
  • String savePath = this.getServletContext().getRealPath(
  • "/WEB-INF/upload");
  • // 上傳時生成的臨時文件保存目錄
  • String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
  • File tmpFile = new File(tempPath);
  • if (!tmpFile.exists()) {
  • ????// 創建臨時目錄
  • ????tmpFile.mkdir();
  • }
  • // 消息提示
  • String message = "";
  • try {
  • // 使用Apache文件上傳組件處理文件上傳步驟:
  • // 1、創建一個DiskFileItemFactory工廠
  • DiskFileItemFactory factory = new DiskFileItemFactory();
  • // 設置工廠的緩沖區的大小,當上傳的文件大小超過緩沖區的大小時,就會生成一個臨時文件存放到指定的臨時目錄當中。
  • factory.setSizeThreshold(1024 * 100);
  • // 設置緩沖區的大小為100KB,如果不指定,那么緩沖區的大小默認是10KB
  • // 設置上傳時生成的臨時文件的保存目錄
  • factory.setRepository(tmpFile);
  • // 2、創建一個文件上傳解析器
  • ServletFileUpload upload = new ServletFileUpload(factory);
  • // 監聽文件上傳進度
  • upload.setProgressListener(new ProgressListener() {
  • public void update(long pBytesRead, long pContentLength,int arg2) {
  • System.out.println("文件大小為:" + pContentLength + ",當前已處理:" + pBytesRead);
  • /**
  • * 文件大小為:14608,當前已處理:4096 文件大小為:14608,當前已處理:7367
  • * 文件大小為:14608,當前已處理:11419 文件大小為:14608,當前已處理:14608
  • */
  • }
  • });
  • // 解決上傳文件名的中文亂碼
  • upload.setHeaderEncoding("GBK");
  • // 3、判斷提交上來的數據是否是上傳表單的數據
  • if (!ServletFileUpload.isMultipartContent(request)) {
  • // 按照傳統方式獲取數據
  • return;
  • }
  • // 設置上傳單個文件的大小的最大值,目前是設置為1024*1024字節,也就是100MB+++++++++++++++++++++++++++++++++++++
  • upload.setFileSizeMax(1024 * 1024 * 100);
  • // 設置上傳文件總量的最大值,最大值=同時上傳的多個文件的大小的最大值的和,目前設置為100MB
  • upload.setSizeMax(1024 * 1024 *100);
  • // 4、使用ServletFileUpload解析器解析上傳數據,解析結果返回的是一個List<FileItem>集合,
  • // 每一個FileItem對應一個Form表單的輸入項
  • List<FileItem> list = upload.parseRequest(request);
  • for (FileItem item : list) {
  • // 如果fileitem中封裝的是普通輸入項的數據
  • if (item.isFormField()) {
  • String name = item.getFieldName();
  • // 解決普通輸入項的數據的中文亂碼問題
  • String value = item.getString("GBK");
  • // value = new String(value.getBytes("iso8859-1"),"UTF-8");
  • System.out.println(name + "=" + value);
  • } else {
  • // 如果fileitem中封裝的是上傳文件
  • // 得到上傳的文件名稱,
  • String filename = item.getName();
  • System.out.println(filename);
  • if (filename == null || filename.trim().equals("")) {
  • continue;
  • }
  • // 注意:不同的瀏覽器提交的文件名是不一樣的,有些瀏覽器提交上來的文件名是帶有路徑的,
  • // 如: c:\a\b\1.txt,而有些只是單純的文件名,如:1.txt
  • // 處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分
  • filename = filename.substring(filename.lastIndexOf("\\") + 1);
  • // 得到上傳文件的擴展名
  • String fileExtName = filename.substring(filename.lastIndexOf(".") + 1);
  • // 如果需要限制上傳的文件類型,那么可以通過文件的擴展名來判斷上傳的文件類型是否合法
  • System.out.println("上傳的文件的擴展名是:" + fileExtName);
  • // 獲取item中的上傳文件的輸入流
  • InputStream in = item.getInputStream();
  • // 得到文件保存的名稱
  • String saveFilename = makeFileName(filename);
  • // 得到文件的保存目錄
  • String realSavePath = makePath(saveFilename, savePath);
  • // 創建一個文件輸出流(這里在linux不能用‘\’只能用‘/’
  • FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
  • // 創建一個緩沖區
  • byte buffer[] = new byte[1024];
  • // 判斷輸入流中的數據是否已經讀完的標識
  • int len = 0;
  • // 循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據
  • while ((len = in.read(buffer)) > 0) {
  • // 使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + "\\"
  • // + filename)當中
  • out.write(buffer, 0, len);
  • }
  • // 關閉輸入流
  • in.close();
  • // 關閉輸出流
  • out.close();
  • // 刪除處理文件上傳時生成的臨時文件
  • // item.delete();
  • message = "文件上傳成功!";
  • }
  • }
  • } catch (FileUploadBase.FileSizeLimitExceededException e) {
  • e.printStackTrace();
  • request.setAttribute("message", "單個文件超出最大值100M!!!");
  • request.getRequestDispatcher("/upload.jsp").forward(request,
  • response);
  • return;
  • } catch (FileUploadBase.SizeLimitExceededException e) {
  • e.printStackTrace();
  • request.setAttribute("message", "上傳文件的總的大小超出限制的最大值100M!!!");
  • request.getRequestDispatcher("/upload.jsp").forward(request,
  • response);
  • return;
  • } catch (Exception e) {
  • message = "文件上傳失敗!";
  • e.printStackTrace();
  • }
  • request.setAttribute("message", message);
  • request.getRequestDispatcher("/upload.jsp").forward(request, response);
  • }
  • }
  • jsp、
  • <%@ page contentType="text/html; charset=GBK"%>
  • <%
  • String path = request.getContextPath();
  • String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  • %>
  • <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • <%@ page isELIgnored="false"%>
  • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  • <html>
  • <head>
  • <base href="<%=basePath%>">
  • <title>My JSP 'upload.jsp' starting page</title>
  • <metahttp-equiv="pragma"content="no-cache">
  • <metahttp-equiv="cache-control"content="no-cache">
  • <metahttp-equiv="expires"content="0">
  • <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  • <metahttp-equiv="description"content="This is my page">
  • <!--
  • <link rel="stylesheet" type="text/css" href="styles.css">
  • -->
  • <SCRIPTtype="text/javascript"src="${pageContext.request.contextPath }/bg/common/js/jquery-1.8.1.min.js"></SCRIPT>
  • </head>
  • <scripttype="text/javascript">
  • $(function(){
  • })
  • </script>
  • <body>
  • <divalign="center"style="padding-top:100px;">
  • <div><spanstyle="color: red;">${message }</span></div>
  • <formaction="${pageContext.request.contextPath }/servlet/UploadHandleServlet"enctype="multipart/form-data"method="post">
  • 上傳用戶:<inputtype="text"name="username"><br/>
  • 上傳文件1:<inputtype="file"name="file1"><br/>
  • 上傳文件2:<inputtype="file"name="file2"><br/>
  • <inputtype="submit"value="提交">
  • </form>
  • <div>
  • <ahref="${pageContext.request.contextPath }/servlet/ListFileServlet">進入下載頁</a>
  • </div>
  • </div>
  • <scripttype="text/javascript">
  • $(function(){
  • //window.location.href="${pageContext.request.contextPath }/404.html";
  • })
  • </script>
  • </body>
  • </html>
  • 二、顯示下載的內容
  • package com.odj.common.upload;
  • import java.io.File;
  • import java.io.IOException;
  • import java.util.HashMap;
  • import java.util.Map;
  • import javax.servlet.ServletException;
  • import javax.servlet.http.HttpServlet;
  • import javax.servlet.http.HttpServletRequest;
  • import javax.servlet.http.HttpServletResponse;
  • /**
  • * 列出Web系統中所有下載文件
  • * @author tanyicheng
  • * 2016年9月28日-下午8:59:17
  • */
  • public class ListFileServlet extends HttpServlet {
  • public void doGet(HttpServletRequest request, HttpServletResponse response)
  • throws ServletException, IOException {
  • doPost(request, response);
  • }
  • /**
  • * 遞歸遍歷指定目錄下的所有文件
  • * @author tanyicheng 2016年9月28日-下午8:59:36
  • * @param file 即代表一個文件,也代表一個文件目錄
  • * @param map map存儲文件名的Map集合
  • */
  • public void listfile(File file, Map<String, String> map) {
  • // 如果file代表的不是一個文件,而是一個目錄
  • if (!file.isFile()) {
  • // 列出該目錄下的所有文件和目錄
  • File files[] = file.listFiles();
  • // 遍歷files[]數組
  • if(files != null ){
  • for (File f : files) {
  • // 遞歸
  • listfile(f, map);
  • }
  • }else{
  • map.put("name", "暫無文件");
  • return;
  • }
  • } else {
  • /**
  • * 處理文件名,上傳后的文件是以uuid_文件名的形式去重新命名的,去除文件名的uuid_部分
  • * file.getName().indexOf("_")檢索字符串中第一次出現"_"字符的位置,
  • * 如果文件名類似于:9349249849-88343-8344_阿_凡_達.avi那么
  • * file.getName().substring(file.getName().indexOf("_")+1) 處理之后就可以得到阿_凡_達.avi部分
  • * */
  • String realName = file.getName().substring(file.getName().indexOf("_") + 1);
  • // file.getName()得到的是文件的原始名稱,這個名稱是唯一的,因此可以作為key,realName是處理過后的名稱,有可能會重復
  • map.put(file.getName(), realName);
  • }
  • }
  • /**
  • * 列出Web系統中所有下載文件
  • */
  • public void doPost(HttpServletRequest request, HttpServletResponse response)
  • throws ServletException, IOException {
  • // 獲取上傳文件的目錄
  • String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");
  • // 存儲要下載的文件名
  • Map<String, String> fileNameMap = new HashMap<String, String>();
  • // 遞歸遍歷filepath目錄下的所有文件和目錄,將文件的文件名存儲到map集合中
  • listfile(new File(uploadFilePath), fileNameMap);
  • // File既可以代表一個文件也可以代表一個目錄
  • // 將Map集合發送到listfile.jsp頁面進行顯示
  • if(fileNameMap == null){
  • fileNameMap.put("fileNameMap", "暫無文件");
  • }else{
  • request.setAttribute("fileNameMap", fileNameMap);
  • }
  • request.getRequestDispatcher("/listfile.jsp").forward(request, response);
  • }
  • }
  • jsp、
  • <%@ page language="java" contentType="text/html; charset=UTF-8"
  • pageEncoding="UTF-8"%>
  • <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  • <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  • <html>
  • <head>
  • <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
  • <title>Insert title here</title>
  • </head>
  • <body>
  • <!-- 遍歷Map集合 -->
  • <c:forEachvar="me"items="${fileNameMap}">
  • <c:urlvalue="/servlet/DownLoadServlet"var="downurl">
  • <c:paramname="filename"value="${me.key}"></c:param>
  • </c:url>${me.value}<ahref="${downurl}">下載</a>
  • <br/>
  • </c:forEach>
  • </body>
  • </html>
  • 三、下載文件
  • package com.odj.common.upload;
  • import java.io.File;
  • import java.io.FileInputStream;
  • import java.io.IOException;
  • import java.io.OutputStream;
  • import java.net.URLEncoder;
  • import javax.servlet.ServletException;
  • 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 = request.getParameter("filename");
  • // 23239283-92489-阿凡達.
  • fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
  • // 上傳的文件都是保存在/WEB-INF/upload目錄下的子目錄當中
  • String fileSaveRootPath = this.getServletContext().getRealPath("/WEB-INF/upload");
  • // 通過文件名找出文件的所在目錄(這里暫沒有多級目錄)
  • //String path = findFileSavePathByFileName(fileName, fileSaveRootPath);
  • // 得到要下載的文件(如果使用多級目錄需要將fileSaveRootPath換為path************************************************)
  • File file = new File(fileSaveRootPath + "\\" + fileName);
  • // 如果文件不存在
  • if (!file.exists()) {
  • request.setAttribute("message", "您要下載的資源已被刪除!!");
  • request.getRequestDispatcher("/upload.jsp").forward(request,response);
  • return;
  • }
  • // 處理文件名
  • String realname = fileName.substring(fileName.indexOf("_") + 1);
  • // 設置響應頭,控制瀏覽器下載該文件
  • response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(realname, "GBK"));
  • // 讀取要下載的文件,保存到文件輸入流
  • FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);
  • // 創建輸出流
  • OutputStream out = response.getOutputStream();
  • // 創建緩沖區
  • byte buffer[] = new byte[1024];
  • int len = 0;
  • // 循環將輸入流中的內容讀取到緩沖區當中
  • while ((len = in.read(buffer)) > 0) {
  • // 輸出緩沖區的內容到瀏覽器,實現文件下載
  • out.write(buffer, 0, len);
  • }
  • // 關閉文件輸入流
  • in.close();
  • // 關閉輸出流
  • out.close();
  • }
  • /***
  • * @Method: findFileSavePathByFileName
  • * @Description:通過文件名和存儲上傳文件根目錄找出要下載的文件的所在路徑
  • * @param filename 要下載的文件名
  • * @param saveRootPath 上傳文件保存的根目錄,也就是/WEB-INF/upload目錄
  • * @return 要下載的文件的存儲目錄
  • */
  • public String findFileSavePathByFileName(String filename,String saveRootPath) {
  • int hashcode = filename.hashCode();
  • int dir1 = hashcode & 0xf;
  • // 0--15
  • int dir2 = (hashcode & 0xf0) >> 4;
  • // 0-15
  • String dir = saveRootPath + "\\" + dir1 + "\\" + dir2;
  • // upload\2\3 upload\3\5
  • File file = new File(dir);
  • if (!file.exists()) {
  • // 創建目錄
  • file.mkdirs();
  • }
  • return dir;
  • }
  • public void doPost(HttpServletRequest request, HttpServletResponse response)
  • throws ServletException, IOException {
  • doGet(request, response);
  • }
  • }
  • 最后、web.xml
  • <!-- servlet上傳、下載文件 start -->
  • <servlet>
  • <servlet-name>UploadHandleServlet</servlet-name>
  • <servlet-class>com.odj.common.upload.UploadHandleServlet</servlet-class>
  • </servlet>
  • <servlet-mapping>
  • <servlet-name>UploadHandleServlet</servlet-name>
  • <url-pattern>/servlet/UploadHandleServlet</url-pattern>
  • </servlet-mapping>
  • <!-- 顯示可以下載的內容 -->
  • <servlet>
  • <servlet-name>ListFileServlet</servlet-name>
  • <servlet-class>com.odj.common.upload.ListFileServlet</servlet-class>
  • </servlet>
  • <servlet-mapping>
  • <servlet-name>ListFileServlet</servlet-name>
  • <url-pattern>/servlet/ListFileServlet</url-pattern>
  • </servlet-mapping>
  • <!-- 文件下載 -->
  • <servlet>
  • <servlet-name>DownLoadServlet</servlet-name>
  • <servlet-class>com.odj.common.upload.DownLoadServlet</servlet-class>
  • </servlet>
  • <servlet-mapping>
  • <servlet-name>DownLoadServlet</servlet-name>
  • <url-pattern>/servlet/DownLoadServlet</url-pattern>
  • </servlet-mapping>
  • <!-- 文件上傳下載 end -->


  • 來自為知筆記(Wiz)



    轉載于:https://www.cnblogs.com/-odj/p/6014756.html

    總結

    以上是生活随笔為你收集整理的servlet上传下载(任何格式的都可以)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。