<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>

            JavaWeb如何實現文件上傳下載功能

            時間:2025-12-18 18:05:48 java語言

            JavaWeb如何實現文件上傳下載功能

              在Web應用系統開發中,文件上傳和下載功能是非常常用的功能下面百分網小編帶大家一起來看看JavaWeb中的文件上傳和下載功能的實現實例解析,有需要的朋友們一起看看吧!想了解更多相關信息請持續關注我們應屆畢業生考試網!

              對于文件上傳,瀏覽器在上傳的過程中是將文件以流的形式提交到服務器端的,如果直接使用Servlet獲取上傳文件的輸入流然后再解析里面的請求參數是比較麻煩,所以一般選擇采用apache的開源工具common-fileupload這個文件上傳組件。這個common-fileupload上傳組件的jar包可以去apache網上面下載,也可以在struts的lib文件夾下面找到,struts上傳的功能就是基于這個實現的。common-fileupload是依賴于common-io這個包的,所以還需要下載這個包。

              一、開發環境搭建

              創建一個FileUploadAndDownLoad項目,加入Apache的commons-fileupload文件上傳組件的相關Jar包,如下圖所示:

              二、實現文件上傳

              2.1、文件上傳頁面和消息提示頁面

              upload.jsp頁面的代碼如下:

              <%@ page="" language="java" pageencoding="UTF-8">

              

              

              

              title文件上傳/title

              

              

              


              上傳用戶:

              上傳文件1:

              上傳文件2:

              

              

              

              

              message.jsp的代碼如下:

              <%@ page="" language="java" pageencoding="UTF-8">

              

              

              

              title消息提示/title

              

              

              ${message}

              

              

              2.2、處理文件上傳的Servlet

              UploadHandleServlet的代碼如下:

              package me.gacl.web.controller;

              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.disk.DiskFileItemFactory;

              import org.apache.commons.fileupload.servlet.ServletFileUpload;

              public class UploadHandleServlet extends HttpServlet {

              public void doGet(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              /pic/p>

              String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

              File file = new File(savePath);

              /pic/p>

              if (!file.exists() && !file.isDirectory()) {

              System.out.println(savePath+"目錄不存在,需要創建");

              /pic/p>

              file.mkdir();

              }

              /pic/p>

              String message = "";

              try{

              /pic/p>

              /pic/p>

              DiskFileItemFactory factory = new DiskFileItemFactory();

              /pic/p>

              ServletFileUpload upload = new ServletFileUpload(factory);

              /pic/p>

              upload.setHeaderEncoding("UTF-8");

              /pic/p>

              if(!ServletFileUpload.isMultipartContent(request)){

              /pic/p>

              return;

              }

              /pic/fileitem>

              Listlist = upload.parseRequest(request);

              for(FileItem item : list){

              /pic/p>

              if(item.isFormField()){

              String name = item.getFieldName();

              /pic/p>

              String value = item.getString("UTF-8");

              /pic/p>

              System.out.println(name + "=" + value);

              }else{/pic/p>

              /pic/p>

              String filename = item.getName();

              System.out.println(filename);

              if(filename==null || filename.trim().equals("")){

              continue;

              }

              /pic/p>

              /pic/p>

              filename = filename.substring(filename.lastIndexOf("")+1);

              /pic/p>

              InputStream in = item.getInputStream();

              /pic/p>

              FileOutputStream out = new FileOutputStream(savePath + "" + filename);

              /pic/p>

              byte buffer[] = new byte[1024];

              /pic/p>

              int len = 0;

              /pic/p>

              while((len=in.read(buffer))>0){

              /pic/p>

              out.write(buffer, 0, len);

              }

              /pic/p>

              in.close();

              /pic/p>

              out.close();

              /pic/p>

              item.();

              message = "文件上傳成功!";

              }

              }

              }catch (Exception e) {

              message= "文件上傳失敗!";

              e.printStackTrace();

              }

              request.setAttribute("message",message);

              request.getRequestDispatcher("/message.jsp").forward(request, response);

              }

              public void doPost(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              doGet(request, response);

              }

              }

              在Web.xml文件中注冊UploadHandleServlet

              

              UploadHandleServlet

              me.gacl.web.controller.UploadHandleServlet

              

              

              UploadHandleServlet

              /servlet/UploadHandleServlet

              

              運行效果如下:

              文件上傳成功之后,上傳的文件保存在了WEB-INF目錄下的upload目錄,如下圖所示:

              2.3、文件上傳的細節

              上述的代碼雖然可以成功將文件上傳到服務器上面的指定目錄當中,但是文件上傳功能有許多需要注意的小細節問題,以下列出的幾點需要特別注意的

              1、為保證服務器安全,上傳文件應該放在外界無法直接訪問的目錄下,比如放于WEB-INF目錄下。

              2、為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名。

              3、為防止一個目錄下面出現太多文件,要使用hash算法打散存儲。

              4、要限制上傳文件的最大值。

              5、要限制上傳文件的類型,在收到上傳文件名時,判斷后綴名是否合法。

              針對上述提出的5點細節問題,我們來改進一下UploadHandleServlet,改進后的代碼如下:

              package me.gacl.web.controller;

              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: 孤傲蒼狼

              * @date: 2015-1-3 下午11:35:50

              *

              */

              public class UploadHandleServlet extends HttpServlet {

              public void doGet(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              /pic/p>

              String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

              /pic/p>

              String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");

              File tmpFile = new File(tempPath);

              if (!tmpFile.exists()) {

              /pic/p>

              tmpFile.mkdir();

              }

              /pic/p>

              String message = "";

              try{

              /pic/p>

              /pic/p>

              DiskFileItemFactory factory = new DiskFileItemFactory();

              /pic/p>

              factory.setSizeThreshold(1024*100);/pic/p>

              /pic/p>

              factory.setRepository(tmpFile);

              /pic/p>

              ServletFileUpload upload = new ServletFileUpload(factory);

              /pic/p>

              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

              */

              }

              });

              /pic/p>

              upload.setHeaderEncoding("UTF-8");

              /pic/p>

              if(!ServletFileUpload.isMultipartContent(request)){

              /pic/p>

              return;

              }

              /pic/p>

              upload.setFileSizeMax(1024*1024);

              /pic/p>

              upload.setSizeMax(1024*1024*10);

              /pic/fileitem>

              Listlist = upload.parseRequest(request);

              for(FileItem item : list){

              /pic/p>

              if(item.isFormField()){

              String name = item.getFieldName();

              /pic/p>

              String value = item.getString("UTF-8");

              /pic/p>

              System.out.println(name + "=" + value);

              }else{/pic/p>

              /pic/p>

              String filename = item.getName();

              System.out.println(filename);

              if(filename==null || filename.trim().equals("")){

              continue;

              }

              /pic/p>

              /pic/p>

              filename = filename.substring(filename.lastIndexOf("")+1);

              /pic/p>

              String fileExtName = filename.substring(filename.lastIndexOf(".")+1);

              /pic/p>

              System.out.println("上傳的文件的擴展名是:"+fileExtName);

              /pic/p>

              InputStream in = item.getInputStream();

              /pic/p>

              String saveFilename = makeFileName(filename);

              /pic/p>

              String realSavePath = makePath(saveFilename, savePath);

              /pic/p>

              FileOutputStream out = new FileOutputStream(realSavePath + "" + saveFilename);

              /pic/p>

              byte buffer[] = new byte[1024];

              /pic/p>

              /pic/p>

              while((len=in.read(buffer))>0){

              /pic/p>

              out.write(buffer, 0, len);

              }

              /pic/p>

              in.close();

              /pic/p>

              out.close();    /pic/pic/p>

              }

              }

              }catch (FileUploadBase.FileSizeLimitExceededException e) {

              e.printStackTrace();

              request.setAttribute("message", "單個文件超出最大值!!!");

              request.getRequestDispatcher("/message.jsp").forward(request, response);

              return;

              }catch (FileUploadBase.SizeLimitExceededException e) {

              e.printStackTrace();

              request.setAttribute("message", "上傳文件的總的大小超出限制的最大值!!!");

              request.getRequestDispatcher("/message.jsp").forward(request, response);

              return;

              }catch (Exception e) {

              message= "文件上傳失敗!";

              e.printStackTrace();

              }

              request.setAttribute("message",message);

              request.getRequestDispatcher("/message.jsp").forward(request, response);

              }

              /**

              * @Method: makeFileName

              * @Description: 生成上傳文件的文件名,文件名以:uuid+"_"+文件的原始名稱

              * @Anthor:孤傲蒼狼

              * @param filename 文件的原始名稱

              * @return uuid+"_"+文件的原始名稱

              */

              private String makeFileName(String filename){ /pic/p>

              /pic/p>

              return UUID.randomUUID().toString() + "_" + filename;

              }

              /**

              * 為防止一個目錄下面出現太多文件,要使用hash算法打散存儲

              * @Method: makePath

              * @Description:

              * @Anthor:孤傲蒼狼

              *

              * @param filename 文件名,要根據文件名生成存儲目錄

              * @param savePath 文件存儲路徑

              * @return 新的存儲目錄

              */

              private String makePath(String filename,String savePath){

              /pic/p>

              int hashcode = filename.hashCode();

              int dir1 = hashcode&0xf; /pic/p>

              int dir2 = (hashcode&0xf0)>>4; /pic/p>

              /pic/p>

              String dir = savePath + "" + dir1 + "" + dir2; /pic/p>

              /pic/p>

              /pic/p>

              if(!file.exists()){

              /pic/p>

              file.mkdirs();

              }

              return dir;

              }

              public void doPost(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              doGet(request, response);

              }

              }

              針對上述提出的5點小細節問題進行改進之后,我們的文件上傳功能就算是做得比較完善了。

              三、文件下載

              3.1、列出提供下載的文件資源

              我們要將Web應用系統中的文件資源提供給用戶進行下載,首先我們要有一個頁面列出上傳文件目錄下的所有文件,當用戶點擊文件下載超鏈接時就進行下載操作,編寫一個ListFileServlet,用于列出Web應用系統中所有下載文件。

              ListFileServlet的代碼如下:

              package me.gacl.web.controller;

              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;

              /**

              * @ClassName: ListFileServlet

              * @Description: 列出Web系統中所有下載文件

              * @author: 孤傲蒼狼

              * @date: 2015-1-4 下午9:54:40

              *

              */

              public class ListFileServlet extends HttpServlet {

              public void doGet(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              /pic/p>

              String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");

              /pic/p>

              MapfileNameMap = new HashMap();

              /pic/p>

              listfile(new File(uploadFilePath),fileNameMap);/pic/p>

              /pic/p>

              request.setAttribute("fileNameMap", fileNameMap);

              request.getRequestDispatcher("/listfile.jsp").forward(request, response);

              }

              /**

              * @Method: listfile

              * @Description: 遞歸遍歷指定目錄下的所有文件

              * @Anthor:孤傲蒼狼

              * @param file 即代表一個文件,也代表一個文件目錄

              * @param map 存儲文件名的Map集合

              */

              public void listfile(File file,Mapmap){

              /pic/p>

              if(!file.isFile()){

              /pic/p>

              File files[] = file.listFiles();

              /pic/p>

              for(File f : files){

              /pic/p>

              listfile(f,map);

              }

              }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);

              /pic/p>

              map.put(file.getName(), realName);

              }

              }

              public void doPost(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              doGet(request, response);

              }

              }

              這里簡單說一下ListFileServlet中listfile方法,listfile方法是用來列出目錄下的所有文件的,listfile方法內部用到了遞歸,在實際開發當中,我們肯定會在數據庫創建一張表,里面會存儲上傳的文件名以及文件的具體存放目錄,我們通過查詢表就可以知道文件的具體存放目錄,是不需要用到遞歸操作的,這個例子是因為沒有使用數據庫存儲上傳的文件名和文件的具體存放位置,而上傳文件的存放位置又使用了散列算法打散存放,所以需要用到遞歸,在遞歸時,將獲取到的文件名存放到從外面傳遞到listfile方法里面的Map集合當中,這樣就可以保證所有的文件都存放在同一個Map集合當中。

              在Web.xml文件中配置ListFileServlet

              

              ListFileServlet

              me.gacl.web.controller.ListFileServlet

              

              

              ListFileServlet

              /servlet/ListFileServlet

              

              展示下載文件的listfile.jsp頁面如下:

              <%@ page="" language="java" import="java.util.*" pageencoding="UTF-8">

              <%@taglib prefix="c" uri="/pic/jsp/jstl/core">

              

              

              

              title下載文件顯示頁面/title

              

              

              

              

              

              

              

              ${me.value}下載

              

              

              

              

              訪問ListFileServlet,就可以在listfile.jsp頁面中顯示提供給用戶下載的文件資源,如下圖所示:

              3.2、實現文件下載

              編寫一個用于處理文件下載的Servlet,DownLoadServlet的代碼如下:

              package me.gacl.web.controller;

              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 {

              /pic/p>

              String fileName = request.getParameter("filename"); /pic/p>

              fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");

              /pic/WEB-INF/upload目錄下的子目錄當中

              String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload");

              /pic/p>

              String path = findFileSavePathByFileName(fileName,fileSaveRootPath);

              /pic/p>

              File file = new File(path + "" + fileName);

              /pic/p>

              if(!file.exists()){

              request.setAttribute("message", "您要下載的資源已被刪除!!");

              request.getRequestDispatcher("/message.jsp").forward(request, response);

              return;

              }

              /pic/p>

              String realname = fileName.substring(fileName.indexOf("_")+1);

              /pic/p>

              response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));

              /pic/p>

              FileInputStream in = new FileInputStream(path + "" + fileName);

              /pic/p>

              OutputStream out = response.getOutputStream();

              /pic/p>

              byte buffer[] = new byte[1024];

              int len = 0;

              /pic/p>

              while((len=in.read(buffer))>0){

              /pic/p>

              out.write(buffer, 0, len);

              }

              /pic/p>

              in.close();

              /pic/p>

              out.close();

              }

              /**

              * @Method: findFileSavePathByFileName

              * @Description: 通過文件名和存儲上傳文件根目錄找出要下載的文件的所在路徑

              * @Anthor:孤傲蒼狼

              * @param filename 要下載的文件名

              * @param saveRootPath 上傳文件保存的根目錄,也就是/WEB-INF/upload目錄

              * @return 要下載的文件的存儲目錄

              */

              public String findFileSavePathByFileName(String filename,String saveRootPath){

              int hashcode = filename.hashCode();

              int dir1 = hashcode&0xf; /pic/p>

              int dir2 = (hashcode&0xf0)>>4; /pic/p>

              String dir = saveRootPath + "" + dir1 + "" + dir2; /pic/p>

              File file = new File(dir);

              if(!file.exists()){

              /pic/p>

              file.mkdirs();

              }

              return dir;

              }

              public void doPost(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

              doGet(request, response);

              }

              }

              在Web.xml文件中配置DownLoadServlet

              

              DownLoadServlet

              me.gacl.web.controller.DownLoadServlet

              

              

              DownLoadServlet

              /servlet/DownLoadServlet

              

              點擊【下載】超鏈接,將請求提交到DownLoadServlet就行處理就可以實現文件下載了,運行效果如下圖所示:

              從運行結果可以看到,我們的文件下載功能已經可以正常下載文件了。

            【JavaWeb如何實現文件上傳下載功能】相關文章:

            JSP頁面如何實現文件上傳下載01-24

            Html5如何實現文件異步上傳功能10-04

            php實現文件上傳及頭像預覽功能07-10

            java如何實現后臺自動發郵件功能03-09

            淺析php如何實現App常用的秒發功能07-04

            如何使用php語言實現文件名稱07-30

            PHP實現文件上傳和多文件上傳01-19

            如何運用Java socket實現多人聊天室功能01-14

            如何使用JS實現短信發送倒計時功能02-17

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院