jsp传文件名到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目录中:

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

179412312_3_20200102022549190_wm

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

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

179412312_4_20200102022549425_wm

179412312_5_20200102022549815_wm

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

179412312_6_20200102022550175_wm

写好以后再点击"保存"

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

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

1.2下载文件

1)通过超链接实现下载

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

179412312_7_20200102022550362_wm

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

179412312_8_20200102022550612_wm

程序运行后,可以通过单击需要下载文档实现下载

179412312_9_20200102022550800_wm

但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

179412312_10_20200102022550956

179412312_10_20200102022550956

179412312_10_20200102022550956

179412312_10_20200102022550956

179412312_10_20200102022550956

179412312_10_20200102022550956

179412312_11_2020010202255181_wm

这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。

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

2)通过Servlet程序实现下载

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

downloadTwo.jsp

179412312_12_20200102022551315_wm

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

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

179412312_13_20200102022551550_wm

179412312_14_20200102022551800_wm

web.xml :

179412312_15_202001020225523_wm

ServletDownload.java :

179412312_16_20200102022552206_wm

179412312_17_20200102022552362_wm

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

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

2.1struts上传文件

先新建web project ,然后Add Struts Capabilties

179412312_18_20200102022552706_wm

179412312_19_202001020225533_wm

179412312_20_20200102022553206_wm

struts.xml  的配置:

179412312_21_20200102022553534_wm

upload.jsp :

179412312_22_20200102022553909_wm

表单中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

179412312_23_20200102022554144_wm

web.xml

179412312_24_20200102022554284_wm

UploadAction.java

179412312_25_20200102022554534_wm

Upload.java

179412312_26_20200102022554815_wm

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下载文件

179412312_27_20200102022555237_wm

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

DownloadAction.java

179412312_28_20200102022555378_wm

struts.xml

179412312_29_20200102022555690_wm

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

2.涉及到的参数:

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

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

2)  attachment :下载时会打开下载框

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

179412312_30_20200102022556144_wm

例子的代码结构:

179412312_31_20200102022556378_wm

179412312_32_20200102022556565_wm

179412312_33_20200102022556831_wm

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

DownloadByJavaAction.java

179412312_34_2020010202255719_wm

179412312_35_20200102022557253_wm

downloadByJava.jsp

179412312_36_20200102022557597_wm

struts.xml

179412312_37_20200102022557862_wm

179412312_38_20200102022558269_wm

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包,如下图:

179412312_39_20200102022558441_wm

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

179412312_40_20200102022558706_wm

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

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

179412312_41_20200102022558940_wm

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进行配置文件如下:

179412312_42_20200102022559190_wm

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

http://localhost:8088/FileUpload/uploadForm

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

179412312_43_20200102022559581_wm 

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

179412312_44_20200102022559815_wm

使用对象接收上传文件

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

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

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

179412312_45_20200102022559987_wm

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

179412312_46_20200102022600206_wm

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

179412312_47_20200102022600409_wm

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

179412312_48_20200102022600675_wm

在浏览器中输入如下URL来测试应用:http://localhost:8088/FileUpload/registerForm

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

179412312_49_20200102022600815_wm 

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

179412312_50_2020010202260119_wm

文件下载

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

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

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

179412312_51_20200102022601253_wm

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文档。

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

179412312_52_20200102022601487_wm

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

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

179412312_53_20200102022601737_wm

179412312_54_20200102022602144_wm

文件上传成功的jsp代码:

179412312_55_20200102022602550_wm

文件上传失败的jsp代码:

179412312_56_20200102022602753_wm

web.xml的配置文件:

179412312_57_20200102022602894_wm

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、付费专栏及课程。

余额充值