亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaWeb實現(xiàn)文件上傳與下載的方法

 更新時間:2016年01月15日 14:48:15   作者:可白  
這篇文章主要介紹了JavaWeb實現(xiàn)文件上傳與下載的方法的相關(guān)資料,需要的朋友可以參考下

文件上傳概述

實現(xiàn)web開發(fā)中的文件上傳功能,需完成如下二步操作

在web頁面中添加上傳輸入項

在servlet中讀取上傳文件的數(shù)據(jù),并保存到本地硬盤中。

如何在web頁面中添加上傳輸入項?

<input type=“file”>標(biāo)簽用于在web頁面中添加文件上傳輸入項,設(shè)置文件上傳輸入項時須注意:

1、必須要設(shè)置input輸入項的name屬性,否則瀏覽器將不會發(fā)送上傳文件的數(shù)據(jù)。

2、必須把form的enctype屬值設(shè)為multipart/form-data.設(shè)置該值后,瀏覽器在上傳文件時,將把文件數(shù)據(jù)附帶在http請求消息體中,并使用MIME協(xié)議對上傳的文件進行描述,以方便接收方對上傳數(shù)據(jù)進行解析和處理。

文件上傳概述

如何在Servlet中讀取文件上傳數(shù)據(jù),并保存到本地硬盤中?

Request對象提供了一個getInputStream方法,通過這個方法可以讀取到客戶端提交過來的數(shù)據(jù)。但由于用戶可能會同時上傳多個文件,在servlet端編程直接讀取上傳數(shù)據(jù),并分別解析出相應(yīng)的文件數(shù)據(jù)是一項非常麻煩的工作,示例。

為方便用戶處理文件上傳數(shù)據(jù),Apache開源組織提供了一個用來處理表單文件上傳的一個開源組件( Commons-fileupload),該組件性能優(yōu)異,并且其API使用極其簡單,可以讓開發(fā)人員輕松實現(xiàn)web文件上傳功能,因此在web開發(fā)中實現(xiàn)文件上傳功能,通常使用Commons-fileupload組件實現(xiàn)。

使用Commons-fileupload組件實現(xiàn)文件上傳,需要導(dǎo)入該組件相應(yīng)的支撐jar包:Commons-fileupload和commons-io。commons-io不屬于文件上傳組件的開發(fā)jar文件,但Commons-fileupload組件從1.1版本開始,它工作時需要commons-io包的支持。

fileupload組件工作流程

核心API—DiskFileItemFactory

DiskFileItemFactory 是創(chuàng)建 FileItem 對象的工廠,這個工廠類常用方法:

public void setSizeThreshold(int sizeThreshold):設(shè)置內(nèi)存緩沖區(qū)的大小,默認值為10K。當(dāng)上傳文件大于緩沖區(qū)大小時, fileupload組件將使用臨時文件緩存上傳文件。

public void setRepository(java.io.File repository):指定臨時文件目錄,默認值為System.getProperty("java.io.tmpdir").

public DiskFileItemFactory(int sizeThreshold, java.io.File repository):構(gòu)造函數(shù)

核心API—ServletFileUpload

ServletFileUpload 負責(zé)處理上傳的文件數(shù)據(jù),并將表單中每個輸入項封裝成一個 FileItem 對象中。常用方法有:

boolean isMultipartContent(HttpServletRequest request):判斷上傳表單是否為multipart/form-data類型

List parseRequest(HttpServletRequest request):解析request對象,并把表單中的每一個輸入項包裝成一個fileItem對象,并返回一個保存了所有FileItem的list集合。

setFileSizeMax(long fileSizeMax):設(shè)置上傳文件的最大值
setSizeMax(long sizeMax):設(shè)置上傳文件總量的最大值
setHeaderEncoding(java.lang.String encoding):設(shè)置編碼格式
setProgressListener(ProgressListener pListener)

文件上傳案例

實現(xiàn)步驟

1、創(chuàng)建DiskFileItemFactory對象,設(shè)置緩沖區(qū)大小和臨時文件目錄
2、使用DiskFileItemFactory對象創(chuàng)建ServletFileUpload對象,并設(shè)置上傳文件的大小限制。
3、調(diào)用ServletFileUpload.parseRequest方法解析request對象,得到一個保存了所有上傳內(nèi)容的List對象。
4、對list進行迭代,每迭代一個FileItem對象,調(diào)用其isFormField方法判斷是否是上傳文件

為普通表單字段,則調(diào)用getFieldName、getString方法得到字段名和字段值

為上傳文件,則調(diào)用getInputStream方法得到數(shù)據(jù)輸入流,從而讀取上傳數(shù)據(jù)。

編碼實現(xiàn)文件上傳

上傳文件的處理細節(jié)

中文文件亂碼問題

文件名中文亂碼問題,可調(diào)用ServletUpLoader的setHeaderEncoding方法,或者設(shè)置request的setCharacterEncoding屬性

臨時文件的刪除問題

由于文件大小超出DiskFileItemFactory.setSizeThreshold方法設(shè)置的內(nèi)存緩沖區(qū)的大小時,Commons-fileupload組件將使用臨時文件保存上傳數(shù)據(jù),因此在程序結(jié)束時,務(wù)必調(diào)用FileItem.delete方法刪除臨時文件。

Delete方法的調(diào)用必須位于流關(guān)閉之后,否則會出現(xiàn)文件占用,而導(dǎo)致刪除失敗的情況。

文件存放位置

為保證服務(wù)器安全,上傳文件應(yīng)保存在應(yīng)用程序的WEB-INF目錄下,或者不受WEB服務(wù)器管理的目錄。

為防止多用戶上傳相同文件名的文件,而導(dǎo)致文件覆蓋的情況發(fā)生,文件上傳程序應(yīng)保證上傳文件具有唯一文件名。

為防止單個目錄下文件過多,影響文件讀寫速度,處理上傳文件的程序應(yīng)根據(jù)可能的文件上傳總量,選擇合適的目錄結(jié)構(gòu)生成算法,將上傳文件分散存儲。

文件下載

因為要下載的文件可以是各種類型的文件,所以要將文件傳送給客戶端,其相應(yīng)內(nèi)容應(yīng)該被當(dāng)做二進制來處理,所以應(yīng)該調(diào)用 方法返回 ServeltOutputStream對象來向客戶端寫入文件內(nèi)容。

下載案例

遍歷上傳目錄下的所有文件顯示給用戶,并允許用戶完成下載。

(讀取某一個文件夾下的所有的文件,存到集合里面List,再存到request作用域范圍中)ListFileServelt—(將所有的文件列表顯示)Listfiles.jsp-----DownloaServlet.java
private String id;
private String savename; //上傳文件的名稱,文件的uuid名
private String realName; //上傳文件的真實名稱
private String savepath; //記住文件的位置
private Date uptime; //文件的上傳時間
private String description; //文件的描述
private String username; //上傳人
ListFileServlet
package com.hbsi.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class ListFileServlet extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
Stringsavepath = this.getServletContext().getRealPath(
"/WEB-INF/upload");
Mapmap = new HashMap();
listFiles(newFile(savepath), map);
request.setAttribute("map",map);
request.getRequestDispatcher("/listfile.jsp")
.forward(request,response);
}
privatevoid listFiles(File file, Map map) {
if(file.isFile()) {
Stringuuidname = file.getName(); // uuid_a_1_3_3.txt
Stringrealname = uuidname.substring(uuidname.indexOf("_") + 1);
map.put(uuidname,realname);
}else {
File[]files = file.listFiles();
for(File f : files) {
listFiles(f,map);
}
}
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
DownloadServlet
package com.hbsi.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class DownloadServlet extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
Stringfilename = request.getParameter("filename");
filename= new String(filename.getBytes("iso8859-1"), "utf-8");
System.out.println(filename);
Stringsavepath = this.getFileSavePath(this.getRealName(filename));
Filef = new File(savepath + "\\" + filename);
if(!f.exists()) {
request.setAttribute("message","下載的資源不存在");
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(this.getRealName(filename),"UTF-8"));
FileInputStreamin = new FileInputStream(f);
byte[]buf = new byte[1024];
intlen = 0;
OutputStreamout = response.getOutputStream();
while((len = in.read(buf)) > 0) {
out.write(buf,0, len);
}
in.close();
}
publicString getFileSavePath(String filename) {
intdir1 = filename.hashCode() & 0xf;
intdir2 = (filename.hashCode() >> 4) & 0xf;
Stringsavepath = this.getServletContext().getRealPath("/WEB-INF/upload")+"\\" + dir1 + "\\" + dir2;
returnsavepath;
}
publicString getRealName(String filename) {
StringrealName = filename.substring(filename.indexOf("_") + 1);
returnrealName;
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}

相關(guān)文章

  • SpringBoot FreeWorker模板技術(shù)解析

    SpringBoot FreeWorker模板技術(shù)解析

    這篇文章主要介紹了SpringBoot FreeWorker模板技術(shù)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Java動態(tài)加載類示例詳解

    Java動態(tài)加載類示例詳解

    這篇文章主要給大家介紹了關(guān)于Java動態(tài)加載類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Springboot?返回文件給前端的示例代碼

    Springboot?返回文件給前端的示例代碼

    這篇文章主要介紹了Springboot?返回文件給前端的示例代碼,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • springboot 接口版本區(qū)分方式

    springboot 接口版本區(qū)分方式

    這篇文章主要介紹了springboot 接口版本區(qū)分方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中BigInteger與BigDecimal類用法總結(jié)

    Java中BigInteger與BigDecimal類用法總結(jié)

    在Java中有兩個用于大數(shù)字運算的類,分別是java.math.BigInteger類 和 java.math.BigDecimal類,這兩個類都可以用于高精度計算,BigInteger類是針對整型大數(shù)字的處理類,而BigDecimal類是針對大小數(shù)的處理類,接下來帶大家來學(xué)習(xí)一下,在Java中如何處理大數(shù)字
    2023-05-05
  • Java中常用的五種List聲明并賦值操作方式

    Java中常用的五種List聲明并賦值操作方式

    在Java編程中經(jīng)常會使用到集合類來存儲和操作多個元素,List是一種常見的集合類,它允許存儲重復(fù)的元素,并且保持元素的插入順序,這篇文章主要給大家介紹了關(guān)于Java中常用的五種List聲明并賦值操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • SpringMVC?RESTFul實現(xiàn)列表功能

    SpringMVC?RESTFul實現(xiàn)列表功能

    這篇文章主要為大家介紹了SpringMVC?RESTFul實現(xiàn)列表功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java 中分形圖的幾種方法詳解

    Java 中分形圖的幾種方法詳解

    這篇文章主要介紹了Java 中幾種分形的方法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java中RabbitMQ延遲隊列實現(xiàn)詳解

    Java中RabbitMQ延遲隊列實現(xiàn)詳解

    這篇文章主要介紹了Java中RabbitMQ延遲隊列實現(xiàn)詳解,消息過期后,根據(jù)routing-key的不同,又會被死信交換機路由到不同的死信隊列中,消費者只需要監(jiān)聽對應(yīng)的死信隊列進行消費即可,需要的朋友可以參考下
    2023-09-09
  • java中UDP簡單聊天程序?qū)嵗a

    java中UDP簡單聊天程序?qū)嵗a

    這篇文章主要介紹了java中UDP簡單聊天程序?qū)嵗a,有需要的朋友可以參考一下
    2013-12-12

最新評論