最新java实现文件的上传与下载实用

人的记忆力会随着岁月的流逝而衰退,写作可以弥补记忆的不足,将曾经的人生经历和感悟记录下来,也便于保存一份美好的回忆。范文怎么写才能发挥它最大的作用呢?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。

java实现文件的上传与下载篇一

在web应用系统开发中,文件上传和下载功能是非常常用的功能下面百分网小编带大家一起来看看javaweb中的文件上传和下载功能的实现实例解析,有需要的朋友们一起看看吧!想了解更多相关信息请持续关注我们应届毕业生考试网!

对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

创建一个fileuploadanddownload项目,加入apache的commons-fileupload文件上传组件的相关jar包,如下图所示:

页面的代码如下:

<%@ page="" language="java" pageencoding="utf-8">

title文件上传/title

上传用户

上传文件1:

上传文件2:

的代码如下:

<%@ page="" language="java" pageencoding="utf-8">

title消息提示/title

${message}

uploadhandleservlet的代码如下:

package ller;

import ;

import tputstream;

import ption;

import tream;

import ;

import texception;

import rvlet;

import rvletrequest;

import rvletresponse;

import em;

import leitemfactory;

import tfileupload;

public class uploadhandleservlet extends httpservlet {

public void doget(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception {

//得到上传文件的保存目录,将上传的文件存放于web-inf目录下,不允许外界直接访问,保证上传文件的安全

string savepath = vletcontext().getrealpath("/web-inf/upload");

file file = new file(savepath);

//判断上传文件的保存目录是否存在

if (!() && !ctory()) {

n(savepath+"目录不存在,需要创建");

//创建目录

();

}

//消息提示

string message = "";

try{

//使用apache文件上传组件处理文件上传步骤:

//1、创建一个diskfileitemfactory工厂

diskfileitemfactory factory = new diskfileitemfactory();

//2、创建一个文件上传解析器

servletfileupload upload = new servletfileupload(factory);

//解决上传文件名的中文乱码

derencoding("utf-8");

//3、判断提交上来的数据是否是上传表单的数据

if(!ipartcontent(request)){

//按照传统方式获取数据

return;

}

//4、使用servletfileupload解析器解析上传数据,解析结果返回的是一个list

集合,每一个fileitem对应一个form表单的输入项

list

list = equest(request);

for(fileitem item : list){

//如果fileitem中封装的是普通输入项的数据

if(field()){

string name = ldname();

//解决普通输入项的数据的中文乱码问题

string value = ing("utf-8");

//value = new string(es("iso8859-1"),"utf-8");

n(name + "=" + value);

}else{//如果fileitem中封装的是上传文件

//得到上传的文件名称,

string filename = e();

n(filename);

if(filename==null || ().equals("")){

continue;

}

//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:a,而有些只是单纯的文件名,如:

//处理获取到的上传文件的文件名的路径部分,只保留文件名部分

filename = ing(dexof("")+1);

//获取item中的上传文件的输入流

inputstream in = utstream();

//创建一个文件输出流

fileoutputstream out = new fileoutputstream(savepath + "" + filename);

//创建一个缓冲区

byte buffer[] = new byte[1024];

//判断输入流中的数据是否已经读完的标识

int len = 0;

//循环将输入流读入到缓冲区当中,(len=(buffer))>0就表示in里面还有数据

while((len=(buffer))>0){

//使用fileoutputstream输出流将缓冲区的数据写入到指定的目录(savepath + "" + filename)当中

(buffer, 0, len);

}

//关闭输入流

();

//关闭输出流

();

//删除处理文件上传时生成的临时文件

item.();

message = "文件上传成功!";

}

}

}catch (exception e) {

message= "文件上传失败!";

tacktrace();

}

ribute("message",message);

uestdispatcher("/").forward(request, response);

}

public void dopost(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception {

doget(request, response);

}

}

文件中注册uploadhandleservlet

uploadhandleservlet

handleservlet

uploadhandleservlet

/servlet/uploadhandleservlet

运行效果如下:

文件上传成功之后,上传的文件保存在了web-inf目录下的upload目录,如下图所示:

上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意的

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

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

3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。

4、要限制上传文件的最大值。

5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

针对上述提出的5点细节问题,我们来改进一下uploadhandleservlet,改进后的代码如下:

package ller;

import ;

import tputstream;

import ption;

import tream;

import ;

import ;

import texception;

import rvlet;

import rvletrequest;

import rvletresponse;

import em;

import loadbase;

import sslistener;

import leitemfactory;

import tfileupload;

/**

* @classname: uploadhandleservlet

* @description: todo(这里用一句话描述这个类的作用)

* @author: 孤傲苍狼

* @date: 2015-1-3 下午11:35:50

*

*/

public class uploadhandleservlet extends httpservlet {

public void doget(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception {

//得到上传文件的保存目录,将上传的文件存放于web-inf目录下,不允许外界直接访问,保证上传文件的安全

string savepath = vletcontext().getrealpath("/web-inf/upload");

//上传时生成的临时文件保存目录

string temppath = vletcontext().getrealpath("/web-inf/temp");

file tmpfile = new file(temppath);

if (!()) {

//创建临时目录

();

}

//消息提示

string message = "";

try{

//使用apache文件上传组件处理文件上传步骤:

//1、创建一个diskfileitemfactory工厂

diskfileitemfactory factory = new diskfileitemfactory();

//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。

ethreshold(1024*100);//设置缓冲区的大小为100kb,如果不指定,那么缓冲区的大小默认是10kb

//设置上传时生成的临时文件的保存目录

ository(tmpfile);

//2、创建一个文件上传解析器

servletfileupload upload = new servletfileupload(factory);

//监听文件上传进度

gresslistener(new progresslistener(){

public void update(long pbytesread, long pcontentlength, int arg2) {

n("文件大小为:" + pcontentlength + ",当前已处理:" + pbytesread);

/**

* 文件大小为:14608,当前已处理:4096

文件大小为:14608,当前已处理:7367

文件大小为:14608,当前已处理:11419

文件大小为:14608,当前已处理:14608

*/

}

});

//解决上传文件名的中文乱码

derencoding("utf-8");

//3、判断提交上来的数据是否是上传表单的数据

if(!ipartcontent(request)){

//按照传统方式获取数据

return;

}

//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1mb

esizemax(1024*1024);

//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10mb

emax(1024*1024*10);

//4、使用servletfileupload解析器解析上传数据,解析结果返回的是一个list

集合,每一个fileitem对应一个form表单的输入项

list

list = equest(request);

for(fileitem item : list){

//如果fileitem中封装的是普通输入项的数据

if(field()){

string name = ldname();

//解决普通输入项的数据的中文乱码问题

string value = ing("utf-8");

//value = new string(es("iso8859-1"),"utf-8");

n(name + "=" + value);

}else{//如果fileitem中封装的是上传文件

//得到上传的文件名称,

string filename = e();

n(filename);

if(filename==null || ().equals("")){

continue;

}

//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:a,而有些只是单纯的文件名,如:

//处理获取到的上传文件的文件名的路径部分,只保留文件名部分

filename = ing(dexof("")+1);

//得到上传文件的扩展名

string fileextname = ing(dexof(".")+1);

//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法

n("上传的文件的扩展名是:"+fileextname);

//获取item中的上传文件的输入流

inputstream in = utstream();

//得到文件保存的名称

string savefilename = makefilename(filename);

//得到文件的保存目录

string realsavepath = makepath(savefilename, savepath);

//创建一个文件输出流

fileoutputstream out = new fileoutputstream(realsavepath + "" + savefilename);

//创建一个缓冲区

byte buffer[] = new byte[1024];

//判断输入流中的数据是否已经读完的标识    int len = 0;

//循环将输入流读入到缓冲区当中,(len=(buffer))>0就表示in里面还有数据

while((len=(buffer))>0){

//使用fileoutputstream输出流将缓冲区的数据写入到指定的目录(savepath + "" + filename)当中

(buffer, 0, len);

}

//关闭输入流

();

//关闭输出流

();    //删除处理文件上传时生成的临时文件    //item.();    message = "文件上传成功!";

}

}

}catch (zelimitexceededexception e) {

tacktrace();

ribute("message", "单个文件超出最大值!!!");

uestdispatcher("/").forward(request, response);

return;

}catch (mitexceededexception e) {

tacktrace();

ribute("message", "上传文件的总的大小超出限制的最大值!!!");

uestdispatcher("/").forward(request, response);

return;

}catch (exception e) {

message= "文件上传失败!";

tacktrace();

}

ribute("message",message);

uestdispatcher("/").forward(request, response);

}

/**

* @method: makefilename

* @description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称

* @anthor:孤傲苍狼

* @param filename 文件的原始名称

* @return uuid+"_"+文件的原始名称

*/

private string makefilename(string filename){ //

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

return uuid().tostring() + "_" + filename;

}

/**

* 为防止一个目录下面出现太多文件,要使用hash算法打散存储

* @method: makepath

* @description:

* @anthor:孤傲苍狼

*

* @param filename 文件名,要根据文件名生成存储目录

* @param savepath 文件存储路径

* @return 新的存储目录

*/

private string makepath(string filename,string savepath){

//得到文件名的hashcode的值,得到的就是filename这个字符串对象在内存中的地址

int hashcode = de();

int dir1 = hashcode&0xf; //0--15

int dir2 = (hashcode&0xf0)>>4; //0-15

//构造新的保存目录

string dir = savepath + "" + dir1 + "" + dir2; //upload23 upload35

//file既可以代表文件也可以代表目录  file file = new file(dir);

//如果目录不存在

if(!()){

//创建目录

();

}

return dir;

}

public void dopost(httpservletrequest request, httpservletresponse response)

throws servletexception, ioexception {

doget(request, response);

}

}

针对上述提出的5点小细节问题进行改进之后,我们的文件上传功能就算是做得比较完善了。

猜你感兴趣
最新java实现文件的上传与下载实用

最新java实现文件的上传与下载实用

人的记忆力会随着岁月的流逝而衰退,写作可以弥补记忆的不足,将曾经的人生经历和感悟记录下来,也便于保存一份美好的回忆。范文怎么写才能发挥它最大的作用呢?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。java实现文...

其他范文 2024-04-22
2024年韩国留学申请流程和材料要求 韩国留学申请攻略汇总

2024年韩国留学申请流程和材料要求 韩国留学申请攻略汇总

在日常学习、工作或生活中,大家总少不了接触作文或者范文吧,通过文章可以把我们那些零零散散的思想,聚集在一块。范文怎么写才能发挥它最大的作用呢?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。韩国留学申请流程和材料...

其他范文 2024-04-22
2024年新的一年对公司的祝福语模板

2024年新的一年对公司的祝福语模板

无论是身处学校还是步入社会,大家都尝试过写作吧,借助写作也可以提高我们的语言组织能力。那么我们该如何写一篇较为完美的范文呢?以下是我为大家搜集的优质范文,仅供参考,一起来看看吧新的一年对公司的祝福语篇一新年的钟声即将敲响,除夕的喜庆弥漫院落...

其他范文 2024-04-22
申论作文开头写法模板

申论作文开头写法模板

在日常学习、工作或生活中,大家总少不了接触作文或者范文吧,通过文章可以把我们那些零零散散的思想,聚集在一块。相信许多人会觉得范文很难写?这里我整理了一些优秀的范文,希望对大家有所帮助,下面我们就来了解一下吧。申论作文开头写法篇一我们都知道申...

其他范文 2024-04-22
最新泰国暹罗大学如何申请留学实用

最新泰国暹罗大学如何申请留学实用

每个人都曾试图在平淡的学习、工作和生活中写一篇文章。写作是培养人的观察、联想、想象、思维和记忆的重要手段。写范文的时候需要注意什么呢?有哪些格式需要注意呢?以下是小编为大家收集的优秀范文,欢迎大家分享阅读。泰国暹罗大学如何申请留学篇一(2)...

其他范文 2024-04-22
意大利留学国际生分数要求通用

意大利留学国际生分数要求通用

在日常学习、工作或生活中,大家总少不了接触作文或者范文吧,通过文章可以把我们那些零零散散的思想,聚集在一块。写范文的时候需要注意什么呢?有哪些格式需要注意呢?这里我整理了一些优秀的范文,希望对大家有所帮助,下面我们就来了解一下吧。意大利留学...

其他范文 2024-04-22
加拿大留学学校申请优秀

加拿大留学学校申请优秀

范文为教学中作为模范的文章,也常常用来指写作的模板。常常用于文秘写作的参考,也可以作为演讲材料编写前的参考。范文书写有哪些要求呢?我们怎样才能写好一篇范文呢?这里我整理了一些优秀的范文,希望对大家有所帮助,下面我们就来了解一下吧。加拿大留学...

其他范文 2024-04-22
小学《节约调查与行动》实践活动教案设计优秀

小学《节约调查与行动》实践活动教案设计优秀

作为一位兢兢业业的人民教师,常常要写一份优秀的教案,教案是保证教学取得成功、提高教学质量的基本条件。既然教案这么重要,那到底该怎么写一篇优质的教案呢?这里我给大家分享一些最新的教案范文,方便大家学习。小学《节约调查与行动》实践活动教案设计篇...

其他范文 2024-04-22
2024年创意艺术大学知名校友 创意艺术大学官网精选

2024年创意艺术大学知名校友 创意艺术大学官网精选

在日常的学习、工作、生活中,肯定对各类范文都很熟悉吧。那么我们该如何写一篇较为完美的范文呢?这里我整理了一些优秀的范文,希望对大家有所帮助,下面我们就来了解一下吧。创意艺术大学知名校友 创意艺术大学官网篇一发言中,马库教授激动地表达了对中国...

其他范文 2024-04-22
最新如何申请悉尼大学艺术设计专业硕士优秀

最新如何申请悉尼大学艺术设计专业硕士优秀

无论是身处学校还是步入社会,大家都尝试过写作吧,借助写作也可以提高我们的语言组织能力。大家想知道怎么样才能写一篇比较优质的范文吗?这里我整理了一些优秀的范文,希望对大家有所帮助,下面我们就来了解一下吧。如何申请悉尼大学艺术设计专业硕士篇一...

其他范文 2024-04-22
2024年夏堇花期多长时间模板

2024年夏堇花期多长时间模板

无论是身处学校还是步入社会,大家都尝试过写作吧,借助写作也可以提高我们的语言组织能力。那么我们该如何写一篇较为完美的范文呢?下面我给大家整理了一些优秀范文,希望能够帮助到大家,我们一起来看一看吧。夏堇花期多长时间篇一有花友在了解夏堇花期多长...

其他范文 2024-04-22
最新人教版公顷和平方千米教案 公顷和平方千米教案第二课时实用

最新人教版公顷和平方千米教案 公顷和平方千米教案第二课时实用

作为一名默默奉献的教育工作者,通常需要用到教案来辅助教学,借助教案可以让教学工作更科学化。优秀的教案都具备一些什么特点呢?下面是我给大家整理的教案范文,欢迎大家阅读分享借鉴,希望对大家能够有所帮助。人教版公顷和平方千米教案 公顷和平方千米教...

其他范文 2024-04-22
2024年心理咨询 二级精选

2024年心理咨询 二级精选

在日常学习、工作或生活中,大家总少不了接触作文或者范文吧,通过文章可以把我们那些零零散散的思想,聚集在一块。范文怎么写才能发挥它最大的作用呢?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。心理咨询 二级篇一2...

其他范文 2024-04-22
重庆市无线电监测站官网通用

重庆市无线电监测站官网通用

人的记忆力会随着岁月的流逝而衰退,写作可以弥补记忆的不足,将曾经的人生经历和感悟记录下来,也便于保存一份美好的回忆。那么我们该如何写一篇较为完美的范文呢?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。重庆市无线...

其他范文 2024-04-22
2024年美国康乃尔大学世界排名 美国康奈尔学院排名模板

2024年美国康乃尔大学世界排名 美国康奈尔学院排名模板

无论是身处学校还是步入社会,大家都尝试过写作吧,借助写作也可以提高我们的语言组织能力。那么我们该如何写一篇较为完美的范文呢?接下来小编就给大家介绍一下优秀的范文该怎么写,我们一起来看一看吧。美国康乃尔大学世界排名 美国康奈尔学院排名篇一2...

其他范文 2024-04-22
最新韩国京畿大学在哪汇总

最新韩国京畿大学在哪汇总

在日常的学习、工作、生活中,肯定对各类范文都很熟悉吧。大家想知道怎么样才能写一篇比较优质的范文吗?下面是小编为大家收集的优秀范文,供大家参考借鉴,希望可以帮助到有需要的朋友。韩国京畿大学在哪篇一张佑赫(京畿大学大众传媒专业,韩国艺人,h....

其他范文 2024-04-22
丹尼尔戴维斯实用

丹尼尔戴维斯实用

人的记忆力会随着岁月的流逝而衰退,写作可以弥补记忆的不足,将曾经的人生经历和感悟记录下来,也便于保存一份美好的回忆。大家想知道怎么样才能写一篇比较优质的范文吗?这里我整理了一些优秀的范文,希望对大家有所帮助,下面我们就来了解一下吧。丹尼尔戴...

其他范文 2024-04-22
最新乌江画廊武隆段 乌江武陵山精选

最新乌江画廊武隆段 乌江武陵山精选

每个人都曾试图在平淡的学习、工作和生活中写一篇文章。写作是培养人的观察、联想、想象、思维和记忆的重要手段。范文书写有哪些要求呢?我们怎样才能写好一篇范文呢?以下是小编为大家收集的优秀范文,欢迎大家分享阅读。乌江画廊武隆段 乌江武陵山篇一1...

其他范文 2024-04-22
2024年800字道歉作文(十篇)

2024年800字道歉作文(十篇)

范文为教学中作为模范的文章,也常常用来指写作的模板。常常用于文秘写作的参考,也可以作为演讲材料编写前的参考。大家想知道怎么样才能写一篇比较优质的范文吗?下面是小编帮大家整理的优质范文,仅供参考,大家一起来看看吧。800字道歉作文篇一此时此刻...

其他范文 2024-04-22
最新有象征意义植物的作文400字精选(3篇)

最新有象征意义植物的作文400字精选(3篇)

无论是身处学校还是步入社会,大家都尝试过写作吧,借助写作也可以提高我们的语言组织能力。那么我们该如何写一篇较为完美的范文呢?接下来小编就给大家介绍一下优秀的范文该怎么写,我们一起来看一看吧。有象征意义植物的作文400字篇一瑞草:小巧的吉祥草...

其他范文 2024-04-22