首页 > 开发 > Java > 正文

JavaEE实现前后台交互的文件上传与下载

2024-07-13 09:56:04
字体:
来源:转载
供稿:网友

这篇文章主要介绍了JavaEE实现前后台交互的文件上传与下载,分享相关技术,实现文件上传下载功能,需要的朋友可以参考下

技术

首先为大家介绍相关的:

service方法中的两个重要参数。

ServletRequest – 用接收用户的请求,

它的作用是:

可获取请求头信息。

可设置请请求的字符编码。

可获得用户传递的参数。Post或get。

可获取远程(即访问者)的IP地址。

可获取输入流,如用户上传文件、相片等。

它的一个子接口:javax.servlet.http.HttpServletRequest

ServletResponse – 用于向用户返回数据。

设置响应类型- contentType

设置编码-setCharacterEncoding

获取输出流。

它的一个子接口:javax.servlet.http.HttpServletResponse

文件下载技术:

文件下载技术相当于文件上传技术相对而言比较简单。我们以下载图片为例:

图片都是先浏览再下载

1.前端代码:

 

 
  1. <span style="font-size:14px;"><a href="img">查找文件夹下面的所有图片</a><br/></span>  

前台只需要一句话就可以搞定了。直接通过web.xml查找后台的程序

2.后台显示代码:

 

 
  1. <span style="font-size:14px;">public class ShowImg extends HttpServlet {  
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  3. throws ServletException, IOException {  
  4. <span style="white-space:pre"> </span>doPost(request, response);//为了防止异常,将doGet和doPost连接在一起  
  5. }</span>  
  6.  
  7. <span style="font-size:14px;">public void doPost(HttpServletRequest request, HttpServletResponse response)  
  8. throws ServletException, IOException {  
  9.  
  10. request.setCharacterEncoding("utf-8");  
  11. response.setContentType("text/html;charset=utf-8");  
  12. PrintWriter out = response.getWriter();</span>  
  13.  
  14. <pre name="code" class="html"><span style="font-size:14px;">//<span style="white-space:pre"> </span>调出Servletcontext,当然也可以直接调用---当一一列出图片的时候需要文件的绝对路径</span> 

 

  1. ServletContext context =getServletContext();String path=context.getRealPath("/imgs");//找到该文件夹的绝对路径File file =new File(path); 
  2.  
  3. <span style="font-size:14px;">//<span style="white-space:pre"> </span>找到文件夹之后,列出所有图片供用户浏览  
  4. String files[] =file.list();  
  5. for(String fn:files){</span>  
  6.  
  7. <pre name="code" class="html"><span style="font-size:14px;">//一个个的全部显示出来</span>  

// out.print("下载图片");String str="下载图片";//提供下载的超链接,传参---传文件名给用户链接内容下面写out.print(str);out.print(img+"

");}}

3.文件的具体下载

首先必须设置相应的协议。下载协议就需要设置相应的下载头

 

 
  1. <span style="white-space:pre"> </span><span style="font-size:18px;"><strong>response.setContentType("application/force-download"</strong>);//设置相应头</span> 

下载的时候需要显示当前图片的文件名,需要从前台获取,并且从下载获得之后写到前台去

 

 
  1. <span style="font-size:18px;"> <span style="white-space:pre"> </span>OutputStream out=response.getOutputStream();//获得输出流  
  2. String name=request.getParameter("name");//从客服端传过来的参数名  
  3. int num=name.lastIndexOf("/");  
  4. String aa=name.substring(num+1);  
  5. aa=URLEncoder.encode(aa, "UTF-8");//若是中文需要重新编码  
  6. //System.out.println(aa);  
  7. response.setHeader("Content-Disposition",<span style="color:#ff0000;">"<strong>attachment;filename</strong></span>='"+aa+"'");//获取从那边传过来的文件名,以便于存储的时候为下载用户名</span>  

进行具体的下载

 

 
  1. <span style="font-size:18px;"> String filename=this.getServletContext().getRealPath(name);//获得绝对路径,传文件名过来,同时传了可以获得的绝对路径就可以进行读可写了  
  2. InputStream in=new FileInputStream(filename);  
  3. byte[] b=new byte[1024];  
  4. int len=0;  
  5. while((len=in.read(b))!=-1){  
  6. out.write(b, 0, len);  
  7. }</span>  

效果图:

JavaEE实现前后台交互的文件上传与下载

点击之后的效果图:

JavaEE实现前后台交互的文件上传与下载

传文件名不一样

JavaEE实现前后台交互的文件上传与下载

文件上传技术

文件上传要是自己去写会很麻烦,所以我们可以用别人的包,下载链接点击打开链接

表单:

客户端发送HTTP必须使用multipart/form-data数据类型,表示复合数据类型。

即:

在表单中使用html标签。

需要的包:

Commons-fileupload.jar,核心上传文件工具都在这个包中。

commons-io.jar – 上传文件所需要的包

JavaEE实现前后台交互的文件上传与下载

详解:

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 list=sf.parseRequest(request);//开始解析

for(FileItem it:list){//获得文件名。以及用到uuid解决重名的问题

FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//写的指定的文件夹中

}

1、前台代码:

 

 
  1. <span style="font-size:18px;"><h2>上传文件</h2>  
  2. <form action="UpFile" method="post" <span style="color:#ff0000;">enctype="multipart/form-data"</span> >//必须要写,不然后台没办法去接收数据  
  3. <!-- 必须添加这个enctype="multipart/form-data"--> 
  4. File1<input type="file"<span style="color:#ff6666;"> name</span>="file"/><br/>  
  5. 请输入名称:<input type="text" <span style="color:#ff6666;">name</span>="desc"/><br/>  
  6. File2<input type="file"<span style="color:#ff6666;"> name</span>="file"/><br/>  
  7. 请输入名称:<input type="text"<span style="color:#ff0000;"> name</span>="desc"/><br/>  
  8. <input type="submit" value="提交"/>  
  9. </form></span> 

2、后台代码:

2-1首先创建一个基于硬盘的工厂,用来存放临时文件

 

 
  1. //指定临时存放位置  
  2. File f = new File("F:/ex/temp");//指定临时文件存放位置  
  3. DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//临时文件的大小和存放位置 

2-2 创建一个用ServletFileUpload对象,并且设置文件大小,最大允许传多大的文件

 

 
  1. //创建用于解析的对象  
  2. ServletFileUpload sf =new ServletFileUpload(ff);  
  3. sf.setFileSizeMax(1024*1024*10);//仅仅允许单个存放位置最大值是 10M  
  4. sf.setSizeMax(1024*1024*20);//所有文件的最大值是20M  
  5. String path =this.getServletContext().getRealPath("/imgs");  
  6. System.out.println("存储路径:"+path);  

2-3 开始解析对象

 

 
  1. <span style="white-space:pre"> </span>List<FileItem> list=sf.parseRequest(request);//获得从前台传过来的所有信息,前台必须填写enctype="multipart/form-data"  
  2. for(FileItem it:list){  
  3. it0=it;  
  4. //<span style="white-space:pre"> </span>若是普通表单对象--可以直接判断出  
  5. if(it.isFormField()){//是普通表单项,如 type=text里面name的值  
  6. String name=it.getString("utf-8");  
  7. System.out.println("基本表单项 name:"+name);//下面写的解释的名字  
  8. }else{  
  9. <span style="white-space:pre"> </span>// 这就是前台选择的文件名  
  10. String name=it.getName();//具体的文件路径---绝对路径  
  11. // String str=it.getString();//文件里面的内容  
  12. // System.out.println("str"+str);  
  13. String contenttype=it.getContentType();  
  14. Long size=it.getSize();  
  15. <span style="white-space:pre"> </span>System.out.println(name+","+contenttype+","+size);  
  16. <pre name="code" class="html" style="font-size: 18px;">//<span style="white-space:pre"> </span>在服务器端的资源文件名不能用中文,浏览器会自动编码-------必须要把用户上传的文件名转成没有中文的名字存储,  
  17. //为了让用户在下载时能还原出原来的名字,就要把原文件名和映射名的对应关系存储起来,在用户下载时再转换回来 

//映射名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为存储的绝对路径--之前定义的}

这样能实现简单的上传,但是,这种上传是没有一点安全行了。完整的代码中附上了防一般的小问题还是没问题的

JavaEE实现前后台交互的文件上传与下载

选择文件之后

JavaEE实现前后台交互的文件上传与下载

查看web服务器img里面的文件,文件已经上传到该页面《文件名为uuid生成的文件名》

JavaEE实现前后台交互的文件上传与下载

文件上传源代码:

 

 
  1. <span style="font-size:14px;">package cn.hncu.UPfile;import java.io.File;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import java.io.Writer;  
  5. import java.util.List;  
  6. import java.util.UUID;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;  
  11. import org.apache.commons.fileupload.FileUploadException;  
  12. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  13. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  14. import org.apache.commons.io.FileUtils;  
  15. public class MyupFile extends HttpServlet {  
  16. <span style="white-space: pre;"> </span>//doGET防止有人在用户栏输入地址。没有响应  
  17. <span style="white-space: pre;"> </span>@Override 
  18. <span style="white-space: pre;"> </span>protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  19. <span style="white-space: pre;"> </span>throws ServletException, IOException {  
  20. <span style="white-space: pre;"> </span>resp.setContentType("utf-8");  
  21. <span style="white-space: pre;"> </span>Writer wr=resp.getWriter();  
  22. <span style="white-space: pre;"> </span>wr.write("暂不支持该上传方式");  
  23. <span style="white-space: pre;"> </span>}  
  24. <span style="white-space: pre;"> </span>  
  25. <span style="white-space: pre;"> </span>public void doPost(HttpServletRequest request, HttpServletResponse response)  
  26. <span style="white-space: pre;"> </span>throws ServletException, IOException {  
  27. <span style="white-space: pre;"> </span>request.setCharacterEncoding("utf-8");  
  28. <span style="white-space: pre;"> </span>response.setContentType("text/html;charset=utf-8");  
  29. <span style="white-space: pre;"> </span>PrintWriter out=response.getWriter();  
  30. <span style="white-space: pre;"> </span>//防护 以普通表单上传 法一:  
  31. <span style="white-space: pre;"> </span>//返回值 GET (null) POST1(apllication/x-form-urlencoded,普通表单) POST2(file:multipart/form-data,文件上传表单)  
  32. //<span style="white-space: pre;"> </span>String type =request.getContentType();  
  33. //<span style="white-space: pre;"> </span>if(!type.contains("mulitpart/form-data")){  
  34. //<span style="white-space: pre;"> </span>out.write("不支持普通表单的上传2");  
  35. //<span style="white-space: pre;"> </span>return ;  
  36. //<span style="white-space: pre;"> </span>}  
  37. <span style="white-space: pre;"> </span>// 法二  
  38. <span style="white-space: pre;"> </span>boolean boo=ServletFileUpload.isMultipartContent(request);  
  39. <span style="white-space: pre;"> </span>if(boo==false){  
  40. <span style="white-space: pre;"> </span>out.print("不支持普通表单的上传1");  
  41. <span style="white-space: pre;"> </span>  
  42. <span style="white-space: pre;"> </span>}  
  43. <span style="white-space: pre;"> </span>  
  44. <span style="white-space: pre;"> </span>//指定临时存放位置  
  45. <span style="white-space: pre;"> </span>File f = new File("F:/ex/temp");//指定临时文件存放位置  
  46. <span style="white-space: pre;"> </span>DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//临时文件的大小和存放位置  
  47. <span style="white-space: pre;"> </span>  
  48. <span style="white-space: pre;"> </span>//创建用于解析的对象  
  49. <span style="white-space: pre;"> </span>ServletFileUpload sf =new ServletFileUpload(ff);  
  50. <span style="white-space: pre;"> </span>sf.setFileSizeMax(1024*1024*10);//仅仅允许单个存放位置最大值是 10M  
  51. <span style="white-space: pre;"> </span>sf.setSizeMax(1024*1024*20);//所有文件的最大值是20M  
  52. <span style="white-space: pre;"> </span>String path =this.getServletContext().getRealPath("/imgs");  
  53. <span style="white-space: pre;"> </span>System.out.println("存储路径:"+path);  
  54. <span style="white-space: pre;"> </span>//开始进行解析  
  55. <span style="white-space: pre;"> </span>FileItem it0=null;//用于在finally中进行删除临时文件  
  56. <span style="white-space: pre;"> </span>try {  
  57. <span style="white-space: pre;"> </span>List<FileItem> list=sf.parseRequest(request);//获得从前台传过来的所有信息,前台必须填写enctype="multipart/form-data"  
  58. <span style="white-space: pre;"> </span>for(FileItem it:list){  
  59. <span style="white-space: pre;"> </span>it0=it;  
  60. <span style="white-space: pre;"> </span>if(it.isFormField()){//是普通表单项,如 type=text里面name的值  
  61. <span style="white-space: pre;"> </span>String name=it.getString("utf-8");  
  62. <span style="white-space: pre;"> </span>System.out.println("基本表单项 name:"+name);//下面写的解释的名字  
  63. <span style="white-space: pre;"> </span>}else{  
  64. <span style="white-space: pre;"> </span>String name=it.getName();//具体的文件路径  
  65. //<span style="white-space: pre;"> </span>String n1=it.getFieldName();  
  66. //<span style="white-space: pre;"> </span>String str=it.getString();//文件里面的内容  
  67. //<span style="white-space: pre;"> </span>System.out.println("str"+str);  
  68. //<span style="white-space: pre;"> </span>System.out.println("n1:"+n1);  
  69. <span style="white-space: pre;"> </span>String contenttype=it.getContentType();  
  70. <span style="white-space: pre;"> </span>Long size=it.getSize();  
  71. <span style="white-space: pre;"> </span>//防止文件为空  
  72. <span style="white-space: pre;"> </span>if(size==0){  
  73. <span style="white-space: pre;"> </span>continue;//文件为空,直接返回;  
  74. <span style="white-space: pre;"> </span>}  
  75. <span style="white-space: pre;"> </span>//用户名。必须要填写  
  76. <span style="white-space: pre;"> </span>if(name==null||name.trim()==""){  
  77. <span style="white-space: pre;"> </span>continue;  
  78. <span style="white-space: pre;"> </span>}  
  79. <span style="white-space: pre;"> </span>//<span style="white-space: pre;"> </span>System.out.println(name+","+contenttype+","+size);  
  80. <span style="white-space: pre;"> </span>//在服务器端的资源文件名不能用中文,浏览器会自动编码-------必须要把用户上传的文件名转成没有中文的名字存储,  
  81. <span style="white-space: pre;"> </span>//为了让用户在下载时能还原出原来的名字,就要把原文件名和映射名的对应关系存储起来,在用户下载时再转换回来  
  82. <span style="white-space: pre;"> </span>//映射名  
  83. <span style="white-space: pre;"> </span>String id=UUID.randomUUID().toString().replace("-""");  
  84. <span style="white-space: pre;"> </span>//文件名  
  85. <span style="white-space: pre;"> </span>String lastname=name.substring(name.lastIndexOf("."));  
  86. <span style="white-space: pre;"> </span>//名字文件格式都找到了---组合  
  87. <span style="white-space: pre;"> </span>String filename =id+lastname;  
  88. <span style="white-space: pre;"> </span>//拷贝流。让它写到相应位置  
  89. <span style="white-space: pre;"> </span>FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));}<span style="white-space: pre;"> </span>}} catch (FileUploadException e) {  
  90. <span style="white-space: pre;"> </span>throw new RuntimeException("文件上传解析错误。"+e);  
  91. <span style="white-space: pre;"> </span>}finally{  
  92. <span style="white-space: pre;"> </span>if(it0==null){  
  93. <span style="white-space: pre;"> </span>it0.delete();//删除临时文件  
  94. <span style="white-space: pre;"> </span>}}out.close();}}</span><span style="font-size: 18px;">  
  95. </span>  
  96. 文件下载源代码: 
  97. [html] view plaincopyprint? 
  98. <span style="font-size:14px;">package cn.hncu.downImg;  
  99.  
  100. import java.io.FileInputStream;  
  101. import java.io.IOException;  
  102. import java.io.InputStream;  
  103. import java.io.OutputStream;  
  104. import java.io.PrintWriter;  
  105. import java.net.URLEncoder;  
  106.  
  107. import javax.servlet.ServletException;  
  108. import javax.servlet.http.HttpServlet;  
  109. import javax.servlet.http.HttpServletRequest;  
  110. import javax.servlet.http.HttpServletResponse;  
  111.  
  112. public class DownImgDemo extends HttpServlet {  
  113.  
  114.  
  115. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  116. throws ServletException, IOException {  
  117. doPost(request, response);  
  118. }  
  119.  
  120.  
  121. public void doPost(HttpServletRequest request, HttpServletResponse response)  
  122. throws ServletException, IOException {  
  123. //设置相应头  
  124. response.setContentType("application/force-download");  
  125. //给前台传用户名  
  126. /*传固定的用户名  
  127. String aa="1.jpg";//若是中文,需要编码  
  128. aa=URLEncoder.encode(aa, "UTF-8");  
  129. response.setHeader("Content-Disposition", "attachment;filename='"+aa+"'");////必须要加“attachment;”,否则会变成浏览  
  130. */ 
  131.  
  132. OutputStream out=response.getOutputStream();//获得输出流  
  133. String name=request.getParameter("name");//从客服端传过来的参数名  
  134. int num=name.lastIndexOf("/");  
  135. String aa=name.substring(num+1);  
  136. aa=URLEncoder.encode(aa, "UTF-8");//若是中文需要重新编码  
  137. //System.out.println(aa);  
  138. response.setHeader("Content-Disposition","attachment;filename='"+aa+"'");//获取从那边传过来的文件名,以便于存储的时候为下载用户名  
  139.  
  140. String filename=this.getServletContext().getRealPath(name);//获得绝对路径  
  141. InputStream in=new FileInputStream(filename);  
  142. byte[] b=new byte[1024];  
  143. int len=0;  
  144. while((len=in.read(b))!=-1){  
  145. out.write(b, 0, len);}}}</span><span style="font-size: 18px;">  
  146. </span> 

以上就是本文的全部内容,希望对大家的学习有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表