首页 > 作文

详解JavaWeb如何实现文件上传和下载功能

更新时间:2023-04-04 05:35:27 阅读: 评论:0

目录
1. 文件传输原理及介绍2. javaweb文件上传2.1我们用一个新的方式创建项目2.2 导包2.3 实用类介绍2.4 pom.xml导入需要的依赖2.5 index.jsp2.6 info.jsp2.7 filervlet2.8 配置rvlet2.9 测试结果3. springmvc文件上传和下载3.1 上传3.2 下载

1. 文件传输原理及介绍

2. javaweb文件上传

2.1我们用一个新的方式创建项目

空项目会直接弹出框

把jdk版本设置好

点击确定后是比较干净的,啥都不会,不要慌,点击file->new->module。之后就和之前做过的一样了

创建model:file,配置tomcat运行保证没有错误

2.2 导包

可以选择去maven仓库中下,也可以在官网上搜出来然后复制到项目中,我们创建一个文件夹lib,然后如果从外面复制到项目中需要右键点击add as library添加到内库中

上述只是讲一个新建项目的方式,我后面还是按照之前的用maven进行了一个项目完成

2.3 实用类介绍

文件上传的注意事项

1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放在web-inf目录下。

2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名,

加一个时间戳uuidmd5自己写位运算算法

3.要限制上传文件的最大值

4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

需要用到的类详解

rvletfileupload负责处理上传的文件数据,并将表单中每个输入项封账成一个fileitem对象,在使用rvletfileupload对象解析请求时需要diskfileitemfactory对象。所以,我们需要在进行解析工作前构造好diskfileitemfactory对象,通过rvletfileupload对象的构造方法或tfileitemfactory()方法设置rvletfileupload对象的fileitemfactory属性。

fileitem类

在html页面input必须有

<input type="file" name = "filename">

表单中如果包含一个文件上传输入项的话,这个表单的enctype属性就必须设置为multipart/form-data

常用方法介绍

//isfromfield方法用于判断fileitem类对象封装的数据是一个普通文本表单还是一个文件表单,如果是普通表单就返回true,否则返回falboolean isformfield();//getfieldname方法用于返回表单标签name属性的值string getfieldname();//getstring方法用于将fileitem对象中保存的数据流内容以一个字符串返回string getstring();//getname方法用于获得文件上传字段中的文件名string getname();//以流的形式返回上传文件的数据内容inputstream getinputstream();//delete方法用来清空fileitem类对象中存放的主体内容。如果主题内容被保存在临时文件中,delete方法将删除该临时文件void delete();

rvletfileupload类

rvletfileupload负责处理上传的文件数据,并将表单中每个输入项封装成一个fileitem对象中,使用其parrequest(httprvletrequest)方法可以将通过表单中每一个html标签提交的数据封装成一个fileitem对象,然后以list列表的形式返回。使用该方法处理上传文件简单易用

2.4 pom.xml导入需要的依赖

<!--rvlet 依赖--宝宝拉稀吃什么><dependency>    <groupid>javax.rvlet</groupid>    <artifactid>javax.rvlet-api</artifactid>    <version>4.0.1</version></dependency><!--jsp依赖--><dependency>    <groupid>javax.rvlet.jsp</groupid>    <artifactid>javax.rvlet.jsp-api</artifactid>    <version>2.3.3</version></dependency><!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency>    <groupid>commons-fileupload</groupid>    <artifactid>commons-fileupload</artifactid>    <version>1.4</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency>    <groupid>commons-io</groupid>    <artifactid>commons-io</artifactid>    <version>2.6</version></dependency>

2.5 index.jsp

<%@ page contenttype="text/html;chart=utf-8" language="java" %><html><head>    <title>$title$</title></head><body><%--通过表单上传文件;get:上传文件大小有限制post:上传文件大小没有限制${pagecontext.request.contextpath}获取服务器当前路径--%><form action="${pagecontext.request.contextpath}/upload.do" enctype="multipart/form-data" method="post">    上传用户:<input type="text" name="urname"><br/>    <p><input type="file" name="file1"></p>    <p><input type="file" name="file1"></p>    <p><input type="submit"> | <input type="ret"></p></form></body></html>

2.6 info.jsp

该页面主要用于接受message

<%@ page contenttype="text/html;chart=utf-8" language="java" %><html><head>    <title>title</title></head><body><%=request.getattribute("msg")%></body></html>

2.7 filervlet

这里的包一定要注意不要导错了。另外这里使用了封装的方法让结构看起来更简洁

import org.apache.commons.fileupload.fileitem;import org.apache.commons.fileupload.fileuploadexception;import org.apache.commons.fileupload.progresslistener;import org.apache.commons.fileupload.disk.diskfileitemfactory;import org.apache.commons.fileupload.rvlet.rvletfileupload;import javax.rvlet.rvletexception;import javax.rvlet.http.httprvlet;import javax.rvlet.http.httprvletrequest;import javax.rvlet.http.httprvletrespon;import java.io.*;import java.util.list;import java.util.uuid;public class filervlet extends httprvlet {@overrideprotected void doget(httprvletrequest req, httprvletrespon resp) throws rvletexception, ioexception {dopost(req, resp);}@overrideprotected void dopost(httprvletrequest req, httprvletrespon resp) throws rvletexception, ioexception {//判断上传的文件是普通表单还是带文件的表单if (!rvletfileupload.ismultipartcontent(req)) {return;//终止方法运行,说明这是一个普通的表单}//创建上传文件的保存路径,建议在web-inf路径下,安全,用户无法直接访问上传的文件//获得全局的上下文,地址string uploadpath = this.getrvletcontext().getrealpath("/web-inf/upload");file uploadfile = new file(uploadpath);if (!uploadfile.exists()) {uploadfile.mkdir();//创建这个目录}//缓存,临时文件//临时文件,假如文件超过了预期的大小,我们就把他放到一个临时文件中,过几天激动删除,或者提醒用户转存为永久string tmppath = this.getrvletcontext().getrealpath("/web-inf/tmp");file tmpfile = new file(tmppath);if (!tmpfile.exists()) {tmpfile.mkdir();//创建这个目录}//处理上传的文件,一般需要通过流来获取,我们可以使用request.getinputstream(),原生态的文件上传流获取,//上面的太麻烦,建议使用apache的文件上传组件来实现,common-fileupload,它需要依赖于commons-io组件try {//1.创建diskfileitemfactory对象,处理文件上传路径或者大小限制的diskfileitemfactory factory = getdiskfileitemfactory(tmpfile);//2.获取rvletfileuploadrvletfileupload upload = getrvletfileupload(factory);//3.处理上传文件string msg = uploadparrequest(upload, req, uplo蜗牛过山车adpath);//rvlet请求转发消息req.tattribute("msg", msg);req.getrequestdispatcher("info.jsp").forward(req, resp);} catch (fileuploadexception e) {e.printstacktrace();}}public static diskfileitemfactory getdiskfileitemfactory(file tmpfile) {diskfileitemfactory factory = new diskfileitemfactory();//通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中//可以设可以不设factory.tsizethreshold(1024 * 1024);factory.trepository(tmpfile);return factory;}public static rvletfileupload getrvletfileupload(diskfileitemfactory factory) {//2.获取rvletfileuploadrvletfileupload upload = new rvletfileupload(factory);//可以设,可以不设//监听文件上传进度upload.tprogresslistener(new progresslistener() {//pcontentlength:文件大小//pbytesread:已经读取到的文件大小@overridepublic void update(long pbytesread, long pcontentlength, int pitems) {system.out.println("总大小:" + pcontentlength + "已上传" + pbytesread);}});//处理乱码问题upload.theaderencoding("utf-8");//设置单个文件的最大值upload.tfilesizemax(1024 * 1024 * 10);//设置总共能够上传的文件的大小//1024 = 1kb * 1024 = 1m * 10 = 10mupload.tsizemax(1024 * 1024 * 10);return upload;}public static string uploadparrequest(rvletfileupload upload, httprvletrequest req, string uploadpath) throws fileuploadexception, ioexception {string msg = "";//3.处理上传文件//把前端请求解析,封装成一个fileitem对象,需要从rvletfileupload对象中获取list<fileitem> fileitems = upload.parrequest(req);//每一个表单对象for (fileitem fileitem : fileitems) {//判断上传的文件是普通的表单还是带文件的表单if (fileitem.isformfield()) {//getfieldname()指的是前端表单控件的namestring name = fileitem.getfieldname();string value = fileitem.getstring("utf-8");//处理乱码system.out.println(name + ":" + value);} el {  //文件的情况//=====处理文件//拿到文件名字string uploadfilename = fileitem.getname();system.out.println("上传的文件名:" + uploadfilename);if (uploadfilename.trim().equals("") || uploadfilename == null) {continue;}//获得文件上传的文件名和后缀名;/images/boys/dajie.jpg  下面这块不是必须的string filename = uploadfilename.substring(uploadfilename.lastindexof("/") + 1);string fileextname = uploadfilename.substring(uploadfilename.lastindexof(".") + 1);//如果文件后缀名fileextname不是我们所需要的就直接return,不处理,告诉用户文件类型不对system.out.println("文件信息【件名:" + filename + "---文件类型" + fileextname + "】");//可以使用uuid(唯一识别的通用码),保证文件名唯一//uuid.randomuuid(),随机生成一个唯一识别的通用码//网络传输中的东西,都需要序列化,//比如:pojo,实体类,如果想要在多个电脑上运行,需要进行传输===>需要把对象序列化//implements rializable :标记接口,jvm--> java栈 本地方法栈 ; native---》c++string uuidpath = uuid.randomuuid().tostring();//===处理文件结束//=====存放地址//存到哪?uploadpath//文件真实存在的路径realpathstring realpath = uploadpath + "/" + uuidpath;//给每个文件创建一个对应的文件夹file realpathfile = new file(realpath);if (!realpathfile.exists()) {realpa征稿启示thfile.mkdir();}//=====存放地址完毕//=====文件传输//获得文件上传的流inputstevoream inputstream = fileitem.getinputstream();//创建一个文件输出流//realpath = 真实的文件夹//差了一个文件,加上输出的文件的名字+"/" +uuidfilenamefileoutputstream fos = new fileoutputstream(realpath + "/" + filename);//创建一个缓冲区byte[] buffer = new byte[1024 * 1024];//判断是否读取完毕int len = 0;//如果大于0说明还存在数据while ((len = inputstream.read(buffer)) > 0) {fos.write(buffer, 0, len);}//关闭流fos.clo();inputstream.clo();msg = "文件上传成功!";fileitem.delete();//上传成功,清楚临时文件}}return msg;}}

2.8 配置rvlet

<?xml version="1.0" encoding="utf-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><rvlet><rvlet-name>filervlet</rvlet-name><rvlet-class>com.hxl.rvlet.filervlet</rvlet-class></rvlet><rvlet-mapping><rvlet-name>filervlet</rvlet-name><url-pattern>/upload.do</url-pattern></rvlet-mapping></web-app>

2.9 测试结果

3. springmvc文件上传和下载

3.1 上传

在controller中有两种方式

新建一个module,一套流程整体下来。测试能运行即可

−−>导入jar包

<!--文件上传--><dependency><groupid>commons-fileupload</groupid><artifactid>commons-fileupload</artifactid><version>1.3.3</version></dependency><dependency><groupid>javax.rvlet</groupid><artifactid>javax.rvlet-api</artifactid><version>4.0.1</version></dependency>

−−>index.jsp

<%@ page contenttype="text/html;chart=utf-8" language="java" %><html><head><title>文件上传和下载</title></head><body><form action="${pagecontext.request.contextpath}/upload" enctype="multipart/form-data" method="post"><input type="file" name="file"/><input type="submit" value="upload"></form></body></html>

−−>applicationcontext.xml中配置bean

<!--文件上传配置--><bean id="multipartresolver"  class="org.springframework.web.multipart.commons.commonsmultipartresolver"><!-- 请求的编码格式,必须和jsp的pageencoding属性一致,以便正确读取表单的内容,默认为iso-8859-1 --><property name="defaultencoding" value="utf-8"/><!-- 上传文件大小上限,单位为字节(10485760=10m) --><property name="maxuploadsize" value="10485760"/><property name="maxinmemorysize" value="40960"/></bean>

−−>filecontroller

package com.hxl.controller;i新疆高考网mport org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.requestparam;import org.springframework.web.bind.annotation.restcontroller;import org.springframework.web.multipart.commons.commonsmultipartfile;import javax.rvlet.http.httprvletrequest;import java.io.*;@restcontrollerpublic class filecontroller {//@requestparam("file") 将name=file控件得到的文件封装成commonsmultipartfile 对象//批量上传commonsmultipartfile则为数组即可@requestmapping("/upload")public string fileupload(@requestparam("file") commonsmultipartfile file , httprvletrequest request) throws ioexception {//获取文件名 : file.getoriginalfilename();string uploadfilename = file.getoriginalfilename();//如果文件名为空,直接回到首页!if ("".equals(uploadfilename)){return "redirect:/index.jsp";}system.out.println("上传文件名 : "+uploadfilename);//上传路径保存设置string path = request.getrvletcontext().getrealpath("/upload");//如果路径不存在,创建一个file realpath = new file(path);if (!realpath.exists()){realpath.mkdir();}system.out.println("上传文件保存地址:"+realpath);inputstream is = file.getinputstream(); //文件输入流outputstream os = new fileoutputstream(new file(realpath,uploadfilename)); //文件输出流//读取写出int len=0;byte[] buffer = new byte[1024];while ((len=is.read(buffer))!=-1){os.write(buffer,0,len);os.flush();}os.clo();is.clo();return "redirect:/index.jsp";}/** 采用file.transto 来保存上传的文件*/@requestmapping("/upload2")public string  fileupload2(@requestparam("file") commonsmultipartfile file, httprvletrequest request) throws ioexception {//上传路径保存设置string path = request.getrvletcontext().getrealpath("/upload");file realpath = new file(path);if (!realpath.exists()){realpath.mkdir();}//上传文件地址system.out.println("上传文件保存地址:"+realpath);//通过commonsmultipartfile的方法直接写文件(注意这个时候)file.transferto(new file(realpath +"/"+ file.getoriginalfilename()));return "redirect:/index.jsp";}}

−−>测试:

3.2 下载

1、设置 respon 响应头

2、读取文件 – inputstream

3、写出文件 – outputstream

4、执行操作

5、关闭流 (先开后关)

−−>index.jsp

<a href="${pagecontext.request.contextpath}/download" rel="external nofollow" >点击下载</a>

−−>增加一个upload文件

并且把要下载的图片弄进去

−−>controller

@requestmapping(value="/download")public string downloads(httprvletrespon respon , httprvletrequest request) throws exception{//要下载的图片地址string  path = request.getrvletcontext().getrealpath("/upload");//string  filename = "你想要下载的文件,要加上后缀";string  filename = "1.jpg";//1、设置respon 响应头respon.ret(); //设置页面不缓存,清空bufferrespon.tcharacterencoding("utf-8"); //字符编码respon.tcontenttype("multipart/form-data"); //二进制传输数据//设置响应头respon.theader("content-disposition","attachment;filename="+ urlencoder.encode(filename, "utf-8"));file file = new file(path,filename);//2、 读取文件--输入流inputstream input=new fileinputstream(file);//3、 写出文件--输出流outputstream out = respon.getoutputstream();byte[] buff =new byte[1024];int index=0;//4、执行 写出操作while((index= input.read(buff))!= -1){out.write(buff, 0, index);out.flush();}out.clo();input.clo();return "ok";}

−−>测试:

以上就是详解javaweb如何实现文件上传和下载功能的详细内容,更多关于javaweb文件上传和下载的资料请关注www.887551.com其它相关文章!

本文发布于:2023-04-04 05:35:21,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/180ec3a62ff4f05c4d2e697a182471c9.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:详解JavaWeb如何实现文件上传和下载功能.doc

本文 PDF 下载地址:详解JavaWeb如何实现文件上传和下载功能.pdf

标签:文件   表单   上传   文件上传
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图