JavaEE完成前後台交互的文件上傳與下載。本站提示廣大學習愛好者:(JavaEE完成前後台交互的文件上傳與下載)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaEE完成前後台交互的文件上傳與下載正文
起首為年夜家引見相干的技巧:
service辦法中的兩個主要參數。
ServletRequest – 用吸收用戶的要求,它的感化是:
它的一個子接口:javax.servlet.http.HttpServletRequest
ServletResponse – 用於向用戶前往數據。
它的一個子接口:javax.servlet.http.HttpServletResponse
文件下載技巧:
文件下載技巧相當於文件上傳技巧絕對而言比擬簡略。我們以下載圖片為例:
圖片都是先閱讀再下載
1.前端代碼:
<span ><a href="img">查找文件夾上面的一切圖片</a><br/></span>
前台只須要一句話便可以弄定了。直接經由過程web.xml查找後台的法式
2.後台顯示代碼:
<span >public class ShowImg extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
<span > </span>doPost(request, response);//為了避免異常,將doGet和doPost銜接在一路
}</span>
<span >public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();</span>
<pre name="code" class="html"><span >//<span > </span>調出Servletcontext,固然也能夠直接挪用---當逐個列出圖片的時刻須要文件的相對途徑</span>
ServletContext context =getServletContext();String path=context.getRealPath("/imgs");//找到該文件夾的相對途徑File file =new File(path);
<span >//<span > </span>找到文件夾以後,列出一切圖片供用戶閱讀
String files[] =file.list();
for(String fn:files){</span>
<pre name="code" class="html"><span >//一個個的全體顯示出來</span>
String img="<img src='imgs/"+fn+"'/>";
// out.print("<a href=imgs/'"+fn+"'>下載圖片</a>");String str="<a href='down?name=imgs/"+fn+"'>下載圖片</a>";//供給下載的超鏈接,傳參---傳文件名給用戶鏈接內容上面寫out.print(str);out.print(img+"<br/>");}}
3.文件的詳細下載
起首必需設置響應的協定。下載協定就須要設置響應的下載頭
<span > </span><span ><strong>response.setContentType("application/force-download"</strong>);//設置響應頭</span>
下載的時刻須要顯示以後圖片的文件名,須要早年台獲得,而且從下載取得以後寫到前台去
<span > <span > </span>OutputStream out=response.getOutputStream();//取得輸入流
String name=request.getParameter("name");//從客服端傳過去的參數名
int num=name.lastIndexOf("/");
String aa=name.substring(num+1);
aa=URLEncoder.encode(aa, "UTF-8");//若是中文須要從新編碼
//System.out.println(aa);
response.setHeader("Content-Disposition",<span >"<strong>attachment;filename</strong></span>='"+aa+"'");//獲得從那裡傳過去的文件名,以便於存儲的時刻為下載用戶名</span>
停止詳細的下載
<span > String filename=this.getServletContext().getRealPath(name);//取得相對途徑,傳文件名過去,同時傳了可以取得的相對途徑便可以停止讀可寫了
InputStream in=new FileInputStream(filename);
byte[] b=new byte[1024];
int len=0;
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}</span>
後果圖:
點擊以後的後果圖:
傳文件名紛歧樣
文件上傳技巧
文件上傳如果本身去寫會很費事,所以我們可以用他人的包,下載鏈接點擊翻開鏈接
表單:
客戶端發送HTTP必需應用multipart/form-data數據類型,表現復合數據類型。
即:<form enctype=“multipart/form-data”>
在表單中應用<input type=“file” name=“somename”/>html標簽。
須要的包:
Commons-fileupload.jar,焦點上傳文件對象都在這個包中。
commons-io.jar – 上傳文件所須要的包
詳解:
DiskFileItemFactory-創立監時文件目次,指是緩存區年夜小
ServletFileUpload用於解析HttpServletRequest。前往一組文件對象。
FileItem – 表現用戶上傳的每個文件對像。
重要流程:
File f = new File("F:/ex/temp");//指定暫時文件寄存地位
DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//暫時文件的年夜小和寄存地位
ServletFileUpload sf =new ServletFileUpload(ff);
List<FileItem> list=sf.parseRequest(request);//開端解析
for(FileItem it:list){//取得文件名。和用到uuid處理重名的成績
FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//寫的指定的文件夾中
}
1、前台代碼:
<span ><h2>上傳文件</h2> <form action="UpFile" method="post" <span >enctype="multipart/form-data"</span> >//必需要寫,否則後台沒方法去吸收數據 <!-- 必需添加這個enctype="multipart/form-data"--> File1<input type="file"<span > name</span>="file"/><br/> 請輸出稱號:<input type="text" <span >name</span>="desc"/><br/> File2<input type="file"<span > name</span>="file"/><br/> 請輸出稱號:<input type="text"<span > name</span>="desc"/><br/> <input type="submit" value="提交"/> </form></span>
2、後台代碼:
2-1起首創立一個基於硬盤的工場,用來寄存暫時文件
//指定暫時寄存地位
File f = new File("F:/ex/temp");//指定暫時文件寄存地位
DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//暫時文件的年夜小和寄存地位
2-2 創立一個用ServletFileUpload對象,而且設置文件年夜小,最年夜許可傳多年夜的文件
//創立用於解析的對象
ServletFileUpload sf =new ServletFileUpload(ff);
sf.setFileSizeMax(1024*1024*10);//僅僅許可單個寄存地位最年夜值是 10M
sf.setSizeMax(1024*1024*20);//一切文件的最年夜值是20M
String path =this.getServletContext().getRealPath("/imgs");
System.out.println("存儲途徑:"+path);
2-3 開端解析對象
<span > </span>List<FileItem> list=sf.parseRequest(request);//取得早年台傳過去的一切信息,前台必需填寫enctype="multipart/form-data"
for(FileItem it:list){
it0=it;
//<span > </span>若是通俗表單對象--可以直接斷定出
if(it.isFormField()){//是通俗表單項,如 type=text外面name的值
String name=it.getString("utf-8");
System.out.println("根本表單項 name:"+name);//上面寫的說明的名字
}else{
<span > </span>// 這就是前台選擇的文件名
String name=it.getName();//詳細的文件途徑---相對途徑
// String str=it.getString();//文件外面的內容
// System.out.println("str"+str);
String contenttype=it.getContentType();
Long size=it.getSize();
<span > </span>System.out.println(name+","+contenttype+","+size);
<pre name="code" class="html" >//<span > </span>在辦事器真個資本文件名不克不及用中文,閱讀器會主動編碼-------必需要把用戶上傳的文件名轉成沒有中文的名字存儲,
//為了讓用戶鄙人載時能復原出本來的名字,就要把原文件名和映照名的對應關系存儲起來,在用戶下載時再轉換回來
//映照名String id=UUID.randomUUID().toString().replace("-", "");//全球獨一UUId來停止//文件名String lastname=name.substring(name.lastIndexOf("."));//文件格局//名字文件格局都找到了---組合String filename =id+lastname;//新的文件名//拷貝流。讓它寫到響應地位FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//path為存儲的相對途徑--之前界說的}
如許能完成簡略的上傳,然則,這類上傳是沒有一點平安行了。完全的代碼中附上了防普通的小成績照樣沒成績的
選擇文件以後
檢查web辦事器img外面的文件,文件曾經上傳到該頁面《文件名為uuid生成的文件名》
文件上傳源代碼:
<span >package cn.hncu.UPfile;import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
public class MyupFile extends HttpServlet {
<span > </span>//doGET避免有人在用戶欄輸出地址。沒有呼應
<span > </span>@Override
<span > </span>protected void doGet(HttpServletRequest req, HttpServletResponse resp)
<span > </span>throws ServletException, IOException {
<span > </span>resp.setContentType("utf-8");
<span > </span>Writer wr=resp.getWriter();
<span > </span>wr.write("暫不支撐該上傳方法");
<span > </span>}
<span > </span>
<span > </span>public void doPost(HttpServletRequest request, HttpServletResponse response)
<span > </span>throws ServletException, IOException {
<span > </span>request.setCharacterEncoding("utf-8");
<span > </span>response.setContentType("text/html;charset=utf-8");
<span > </span>PrintWriter out=response.getWriter();
<span > </span>//防護 以通俗表單上傳 法一:
<span > </span>//前往值 GET (null) POST1(apllication/x-form-urlencoded,通俗表單) POST2(file:multipart/form-data,文件上傳表單)
//<span > </span>String type =request.getContentType();
//<span > </span>if(!type.contains("mulitpart/form-data")){
//<span > </span>out.write("不支撐通俗表單的上傳2");
//<span > </span>return ;
//<span > </span>}
<span > </span>// 法二
<span > </span>boolean boo=ServletFileUpload.isMultipartContent(request);
<span > </span>if(boo==false){
<span > </span>out.print("不支撐通俗表單的上傳1");
<span > </span>
<span > </span>}
<span > </span>
<span > </span>//指定暫時寄存地位
<span > </span>File f = new File("F:/ex/temp");//指定暫時文件寄存地位
<span > </span>DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//暫時文件的年夜小和寄存地位
<span > </span>
<span > </span>//創立用於解析的對象
<span > </span>ServletFileUpload sf =new ServletFileUpload(ff);
<span > </span>sf.setFileSizeMax(1024*1024*10);//僅僅許可單個寄存地位最年夜值是 10M
<span > </span>sf.setSizeMax(1024*1024*20);//一切文件的最年夜值是20M
<span > </span>String path =this.getServletContext().getRealPath("/imgs");
<span > </span>System.out.println("存儲途徑:"+path);
<span > </span>//開端停止解析
<span > </span>FileItem it0=null;//用於在finally中停止刪除暫時文件
<span > </span>try {
<span > </span>List<FileItem> list=sf.parseRequest(request);//取得早年台傳過去的一切信息,前台必需填寫enctype="multipart/form-data"
<span > </span>for(FileItem it:list){
<span > </span>it0=it;
<span > </span>if(it.isFormField()){//是通俗表單項,如 type=text外面name的值
<span > </span>String name=it.getString("utf-8");
<span > </span>System.out.println("根本表單項 name:"+name);//上面寫的說明的名字
<span > </span>}else{
<span > </span>String name=it.getName();//詳細的文件途徑
//<span > </span>String n1=it.getFieldName();
//<span > </span>String str=it.getString();//文件外面的內容
//<span > </span>System.out.println("str"+str);
//<span > </span>System.out.println("n1:"+n1);
<span > </span>String contenttype=it.getContentType();
<span > </span>Long size=it.getSize();
<span > </span>//避免文件為空
<span > </span>if(size==0){
<span > </span>continue;//文件為空,直接前往;
<span > </span>}
<span > </span>//用戶名。必需要填寫
<span > </span>if(name==null||name.trim()==""){
<span > </span>continue;
<span > </span>}
<span > </span>//<span > </span>System.out.println(name+","+contenttype+","+size);
<span > </span>//在辦事器真個資本文件名不克不及用中文,閱讀器會主動編碼-------必需要把用戶上傳的文件名轉成沒有中文的名字存儲,
<span > </span>//為了讓用戶鄙人載時能復原出本來的名字,就要把原文件名和映照名的對應關系存儲起來,在用戶下載時再轉換回來
<span > </span>//映照名
<span > </span>String id=UUID.randomUUID().toString().replace("-", "");
<span > </span>//文件名
<span > </span>String lastname=name.substring(name.lastIndexOf("."));
<span > </span>//名字文件格局都找到了---組合
<span > </span>String filename =id+lastname;
<span > </span>//拷貝流。讓它寫到響應地位
<span > </span>FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));}<span > </span>}} catch (FileUploadException e) {
<span > </span>throw new RuntimeException("文件上傳解析毛病。"+e);
<span > </span>}finally{
<span > </span>if(it0==null){
<span > </span>it0.delete();//刪除暫時文件
<span > </span>}}out.close();}}</span><span >
</span>
文件下載源代碼:
[html] view plaincopyprint?
<span >package cn.hncu.downImg;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
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 DownImgDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設置響應頭
response.setContentType("application/force-download");
//給前台傳用戶名
/*傳固定的用戶名
String aa="1.jpg";//若是中文,須要編碼
aa=URLEncoder.encode(aa, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename='"+aa+"'");////必需要加“attachment;”,不然會釀成閱讀
*/
OutputStream out=response.getOutputStream();//取得輸入流
String name=request.getParameter("name");//從客服端傳過去的參數名
int num=name.lastIndexOf("/");
String aa=name.substring(num+1);
aa=URLEncoder.encode(aa, "UTF-8");//若是中文須要從新編碼
//System.out.println(aa);
response.setHeader("Content-Disposition","attachment;filename='"+aa+"'");//獲得從那裡傳過去的文件名,以便於存儲的時刻為下載用戶名
String filename=this.getServletContext().getRealPath(name);//取得相對途徑
InputStream in=new FileInputStream(filename);
byte[] b=new byte[1024];
int len=0;
while((len=in.read(b))!=-1){
out.write(b, 0, len);}}}</span><span >
</span>
以上就是本文的全體內容,願望對年夜家的進修有所贊助。