opera面试java_Java文件上传与下载【面试+工作】

原标题:Java文件上传与下载【面试+工作】

Java实现文件上传与下载【面试+工作】

1.servlet 如何实现文件的上传和下载?1.1上传文件

通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面,

下载就是url 到发布的资源文件,触发即可自动下载。服务器已经封装了如何下载的底层实现。(此处用的是tomcat)

JSP上传文件方法: 关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.

在开始JSP上传文件之前你要准备以下几个东西:

1. commons-FileUpload 1.3 包

下载地址:http://jakarta.apache.org/commons/fileupload/

2. commons-IO 2.5 包

下载地址:http://jakarta.apache.org/commons/io/

有了上面这些东西我们就可以开始了

1. 新建一个叫Servlet_UploadDownLoad的WEB项目

2. 接着把这两个jar包放到WEB-INF/lib目录中:

0e959810778bcdf579179f7dce56d63c.png

3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,

d147e380941787eeaa178ca4eb7de378.png

上面文件中有几个需要注意的地方就是

1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.

2. method="POST" 这里必须为"POST"方式提交不能是"GET".

3. enctype="multipart/form-data" 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.

4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.

接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java

e86fe7fb724ebac7904ab7ec3f4dd788.png

b07a6d0ec04552c481af8120fae92fcb.png

upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:

7f959009d71c1ca6198ae53efe8b795e.png

写好以后再点击"保存"

把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入http://localhost:8080/Servlet_UploadDownLoad/upload.jsp怎么样看到JSP上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有对.

好了,现在我们点击页面上的"浏览"按钮,找到我们要上传的文件,最后点击"Submit",太激动了,还不看一下你的I:updir里面有没有你要的东西.

1.2下载文件1)通过超链接实现下载

在HTML网页中,通过超链接链接到要下载的文件的地址:downloadOne.jsp

e9d4f332aff30f94cc66a75d4847e6da.png

"/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip"是文件路径,程序结构如下图:

1979a5770d362435b243c93901e02657.png

7bd128200393fab5c0e8f5bd1276f3bb.png

8e457dc39a294237e15aaf094e180dff.png

因此利用第二种方法实现下载功能。

2)通过Servlet程序实现下载

通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。

downloadTwo.jsp

c65de771af53cd9c0fde2adebc3e9054.png

其中,/Servlet_UploadDownLoad 是servlet程序的映射路径

然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload

b4209f387d4674f71ac1504e8de42a57.png

50c246a6f715e4fa51ae157f20ee4120.png

web.xml :

632ea5e59e266870d60062f75aeedaff.png

ServletDownload.java :

d299add81da038bf6d9f907cb32d03ce.png

a206d8b745e15bd5216d638a66e274da.png

重启tomcat服务器,即可实现对压缩包和对图片的下载。

2、struts如何实现文件的上传和下载?

2.1struts上传文件

先新建web project ,然后Add Struts Capabilties

3ce6a454fa79bced15b4c853aa6fa91d.png

b43ec01a108cad8a7956fabae8a1fa60.png

638f22c4da284d1b6490478245341159.png

struts.xml 的配置:

2f18e6db88b63a8cd70b38e031f99522.png

upload.jsp :

ea76f37c1f1c626c60be26491195fb48.png

表单中enctype="multipart/form-data"的意思,是设置表单的MIME 编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;

只有使用了multipart /form-data,才能完整的传递文件数据,进行下面的操作.enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。

theme="simple"是struts2 的一个最简单的主题,这样你的标签就生成最简单的HTML元素 不会生成额外的内容

【这里的name一定要与action类里面的name名字一致,set/get】

success.jsp

1c4c662a9e8681804f5a2424d2d79e72.png

web.xml

90ba36779e4e546922e89dac558ff62d.png

UploadAction.java

74eae2e4bc77db96fa979fdc1af33d12.png

Upload.java

757b6e499ee3492a82f811f6b7d1ada8.png

mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下:

new File("/tmp/one/two/three").mkdirs();

执行后, 会建立tmp/one/two/three四级目录

new File("/tmp/one/two/three").mkdir();

则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false

例子的代码结构:2.2struts下载文件

106fadf289e5a913243b9baafbfe5a2e.png

方法一:通过配置struts.xml文件

DownloadAction.java

d51e745b47cceef877b50d86355a7daa.png

struts.xml

86e3dc60fb2b5cee748b06e14bd6ae7e.png

1.结果类型必须要写成 type="stream" ,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult

2.涉及到的参数:

1) attachment;fileName="${fileName}"

contentDisposition默认是 inline(内联的), 比如说下载的文件是文本类型的,就直接在网页上打开,不能直接打开的才会打开下载框自己选择

3) fileName="${fileName}" :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字

3.DownloadFile,这个DownloadFile名字要和DownloadAction.java类中的getDownloadFile()方法名去掉get 一致

Struts2下载文件实现的说明

contentType

内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

inputName

下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

contentDisposition

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:

attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline;filename="struts2.txt"

bufferSize

下载缓冲区的大小

downloadOne.jsp

a41d3d1946fa750580f6b2d7360a5ce7.png

例子的代码结构:

c1e199c3d3820aaa4c562416388cf693.png

932b35059984cc3ef82fdabf2444e3f9.png

83fab6689b094787753e849a0a8f062e.png

方法二:通过配置java文件来实现下载

DownloadByJavaAction.java

df86d5e696dab1027c91cee138929aeb.png

c6125984e991a67e9f225bd7c67b9353.png

downloadByJava.jsp

3f5fd764b9a0455b1ae95dd5633b0e0c.png

struts.xml

194eba5cd6c703bb1ea4909ed0d0d16b.png

07ba9407e1b84de343b7811d05198e1c.png

3、批量下载

使用多线程并发调用单个文件的下载方法即可。

4、断点续传

有待研究。。。。。。。。。。

附件源码:

链接: https://pan.baidu.com/s/1i6wo58L 密码: 3t3m

springMVC文件上传

文件上传是项目开发中最常见的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。

一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。

Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。

Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。

本项目作为测试案例,在此我就不创建Maven项目了,我直接创建的是一个Dynamic Web Project(动态的web项目),采用Tomcat 8作为web服务器,我们需要在项目中引入以下jar包,如下图:

dc9d210c4d34252f13e273536902b454.png

下面我们在WebContent/WEB-INF下创建一个content文件夹,用于放文件的上传、下载等jsp文件,下面我们创建uploadForm.jsp文件,演示Spring MVC的文件上传:

a26f0afb127f28fcdf05fe4154316df9.png

负责上传文件的表单和一般表单有一些区别,负责上传文件的表单的编码类型必须是“multipart/form-data”。

我们再src下创建一个包“cn.edu.jseti.controller”,然后创建一个FileUploadController类,用于实现文件的上传和下载功能。以下是负责上传文件的表单功能代码:

bc4c1415be198a95b85d66ada706de78.png

Spring MVC会将上传的文件绑定到MultipartFile对象中。MultipartFile提供了获取上传文件内容、文件名等方法。通过transferTo()方法还可以将文件存储到硬件中,MultipartFile对象中的常用方法如下:

byte[] getBytes():获取文件数据

String getContentType[]:获取文件MIME类型,如image/jpeg等

InputStream getInputStream():获取文件流

String getName():获取表单中文件组件的名字

String getOriginalFilename():获取上传文件的原名

Long getSize():获取文件的字节大小,单位为byte

boolean isEmpty():是否有上传文件

void transferTo(File dest):将上传文件保存到一个目录文件中

SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。在springmvc-config.xml进行配置文件如下:

ac7bf22b3f7ddf4ffdd69e35efdda0be.png

部署FileUpload这个Web应用,在浏览器中输入如下URL来测试应用:

http://localhost:8088/FileUpload/uploadForm

输入文件描述信息并选择上传文件,如下图:

0826240ba554802d0be1e20f0a60bb2b.png

点上传按钮,这是已将上传的文件通过二进制保存到web服务器上去了,如下图:

ece83edfdc2786a13c666a85aa63d797.png

使用对象接收上传文件

上面我们通过案例演示了Spring MVC上传文件,接下来,我们演示使用对象接收上传文件。

在实际项目的开发中,很多时候上传的文件会作为对象的属性被保存。SpringMVC的处理也非常的简单。

下面我们在content文件夹创建registerForm.jsp文件,演示接收文件上传:

921e2cafbd988665e7d1d0c059ea855f.png

我们在src下面创建一个名叫“cn.edu.jseti.domain”包,然后再创建一个User类,必须要实现序列化接口,如下案例代码:

25205b328e32a6dd837008d09046418a.png

我们在刚才创建的FileUploadController类继续写用于接收文件的上传和下载功能。以下是负责接收文件的表单功能代码:

07c17cd7a19fdda8ad4e4c5ebf047e8c.png

在content文件夹下创建userInfo.jsp文件,该页面主要是文件的下载页面,如下jsp代码:

b280dc873206970fb0641eb682d03b9a.png

在浏览器中输入如下URL来测试应用:

http://localhost:8088/FileUpload/registerForm

输入用户名并上传刚才上传的文件。如下图:

f12f89418c450f8d8be96fb9eec2add7.png

单击“注册”按钮上传文件,然后就会跳转到下载页面。如下图:

b0081fd87649f5e303cd4c6e52bd28ea.png

文件下载

上面我们通过案例演示了使用对象接收上传文件,接下来,我们演示Spring MVC的下载文件。

文件下载比较简单,直接在页面给出了一个超链接,该链接href的属性等于要下载文件的文件名,就可以实现文件下载了。但是如果该文件的文件名为中文文件名,在某些早起的浏览器上就会导致下载失败;如果使用最新的Firefox、Chrome、Opera、Safari则都可以正常下载文件名为中文的文件了。

SpringMVC提供了一个ResponseEntity类型,使用它可以很方便地定义返回的HttpHeaders和HttpStatus。以下代码演示文件的下载功能:

de2a6690775f9395d771187c66dc89ff.png

download处理方法接收页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取项目的上传文件,并将其构建成ResponseEntity对象返回客户端下载。

使用ResponseEntity对象,可以很方便的定义返回的HttpHeaders和HttpStatus。上面代码中的MediaType,代表的是Internet Media Type,即互联网媒体类型,也叫做MIME类型。在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。HttpStatus类型代表的是Http协议中的状态。有关MediaType和HttpStatus类可以参考Spring MVC的API文档。

点击下载页面的超链接,显示文件正在下载,如下图所示:

46c3a69f740641248c545344fc150191.png

单击“浏览”按钮,可以选择下载文件的保存路径,然后单击“确定”按钮,文件就会顺利的下载并保存。

本文中的一些功能案例代码和配置文件不是很完整,下面附上完整代码:

FileUploadController类完整的代码如下:

c767d58f8f0a8e28d39c3940ecbb9ea5.png

590b33e3a893efc304a08c192fe568a0.png

文件上传成功的jsp代码:

e3e1fcff9de50c41e7c462f9c3ca91d2.png

文件上传失败的jsp代码:

7b030e00aeec7b2e81369118e1308866.png

web.xml的配置文件:

f12258cd027444d53eff36e096bb910d.png

OK,以上就是完整的使用Spring MVC框架实现了文件的上传和下载。返回搜狐,查看更多

责任编辑:

package action; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; 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.FileUploadException; import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final long MAX_SIZE = 300 * 1024 * 1024;// 设置上传文件最大值 // 允许上传的文件格式的列表 final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt", "doc", "mp3", "wma", "m4a", "rar", "zip" }; response.setContentType("text/html"); // 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new DiskFileItemFactory(); dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘 dfif.setRepository(new File(request.getRealPath("/") + "ImagesUploadTemp"));// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录 // 用以上工厂实例化上传组件 ServletFileUpload sfu = new ServletFileUpload(dfif); // 设置最大上传大小 sfu.setSizeMax(MAX_SIZE); PrintWriter out = response.getWriter(); // 从request得到所有上传域的列表 List fileList = null; try { fileList = sfu.parseRequest(request); } catch (FileUploadException e) {// 处理文件尺寸过大异常 if (e instanceof SizeLimitExceededException) { out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />"); out .println("<a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } e.printStackTrace(); } // 没有文件上传 if (fileList == null || fileList.size() == 0) { out.println("请选择上传文件<p />"); out.println("<a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } // 得到所有上传的文件 Iterator fileItr = fileList.iterator(); // 循环处理所有文件 while (fileItr.hasNext()) { FileItem fileItem = null; String path = null; long size = 0; // 得到当前文件 fileItem = (FileItem) fileItr.next(); // 忽略简单form字段而不是上传域的文件域(<input type="text" />等) if (fileItem == null || fileItem.isFormField()) { continue; } // 得到文件的完整路径 path = fileItem.getName(); // 得到文件的大小 size = fileItem.getSize(); if ("".equals(path) || size == 0) { out.println("请选择上传文件<p />"); out .println("<a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } // 得到去除路径的文件名 String t_name = path.substring(path.lastIndexOf("\\") + 1); System.out.println(t_name); // 得到文件的扩展名(无扩展名时将得到全名) String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); System.out.println(t_ext); // 拒绝接受规定文件格式之外的文件类型 int allowFlag = 0; int allowedExtCount = allowedExt.length; for (; allowFlag < allowedExtCount; allowFlag++) { if (allowedExt[allowFlag].equals(t_ext)) break; } if (allowFlag == allowedExtCount) { out.println("请上传以下类型的文件<p />"); for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++) out.println("*." + allowedExt[allowFlag] + " "); out .println("<p /><a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } long now = System.currentTimeMillis(); // 根据系统时间生成上传后保存的文件名 String prefix = String.valueOf(now); // 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下 String u_name = request.getRealPath("/") + "ImagesUploaded/" + prefix + "." + t_ext; //String filename = prefix + "." + t_ext; //根据原文件名保存文件 String filename=t_name; try { // 保存文件到C:\\request.getRealPath("/")目录下 fileItem.write(new File(request.getRealPath("/") + filename)); System.out.println(filename); out.println("文件上传成功. 已保存为: " + t_name + " 文件大小: " + size + "字节<p />"); out .println("<a href=\"upload2.jsp\" target=\"_top\">继续上传</a>"); } catch (Exception e) { e.printStackTrace(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值