javaweb上传文件

上传文件的jsp中的部分

上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求

1.通过form表单向后端发送请求

Save

改进后的代码不需要form标签,直接由控件来实现。开发人员只需要关注业务逻辑即可。JS中已经帮我们封闭好了

this.post_file =function()

{

$.each(this.ui.btn,function(i, n) { n.hide();});

this.ui.btn.stop.show();

this.State =this.Config.state.Posting;//

this.app.postFile({ id:this.fileSvr.id, pathLoc:this.fileSvr.pathLoc, pathSvr:this.fileSvr.pathSvr,lenSvr:this.fileSvr.lenSvr, fields:this.fields });

};

通过监控工具可以看到控件提交的数据,非常的清晰,调试也非常的简单。

2.通过ajax向后端发送请求

$.ajax({

url : "${pageContext.request.contextPath}/UploadServlet",

type : "POST",

data : $( '#postForm').serialize(),

success : function(data) {

$( '#serverResponse').html(data);

},

error : function(data) {

$( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText);

}

});

ajax分为两部分,一部分是初始化,文件在上传前通过AJAX请求通知服务端进行初始化操作

this.md5_complete =function(json)

{

this.fileSvr.md5 = json.md5;

this.ui.msg.text("MD5计算完毕,开始连接服务器...");

this.event.md5Complete(this, json.md5);//biz event

varloc_path = encodeURIComponent(this.fileSvr.pathLoc);

varloc_len =this.fileSvr.lenLoc;

varloc_size =this.fileSvr.sizeLoc;

varparam = jQuery.extend({},this.fields,this.Config.bizData, { md5: json.md5, id:this.fileSvr.id, lenLoc: loc_len, sizeLoc: loc_size, pathLoc: loc_path, time:newDate().getTime() });

$.ajax({

type:"GET"

, dataType:'jsonp'

, jsonp:"callback"//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

, url:this.Config["UrlCreate"]

, data: param

, success:function(sv)

{

_this.svr_create(sv);

}

, error:function(req, txt, err)

{

_this.Manager.RemoveQueuePost(_this.fileSvr.id);

alert("向服务器发送MD5信息错误!"+ req.responseText);

_this.ui.msg.text("向服务器发送MD5信息错误");

_this.ui.btn.cancel.show();

_this.ui.btn.stop.hide();

}

, complete:function(req, sta) { req =null; }

});

};

在文件上传完后向服务器发送通知

this.post_complete =function(json)

{

this.fileSvr.perSvr ="100%";

this.fileSvr.complete =true;

$.each(this.ui.btn,function(i, n)

{

n.hide();

});

this.ui.process.css("width","100%");

this.ui.percent.text("(100%)");

this.ui.msg.text("上传完成");

this.Manager.arrFilesComplete.push(this);

this.State =this.Config.state.Complete;

//从上传列表中删除

this.Manager.RemoveQueuePost(this.fileSvr.id);

//从未上传列表中删除

this.Manager.RemoveQueueWait(this.fileSvr.id);

varparam = { md5:this.fileSvr.md5, uid:this.uid, id:this.fileSvr.id, time:newDate().getTime() };

$.ajax({

type:"GET"

, dataType:'jsonp'

, jsonp:"callback"//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

, url: _this.Config["UrlComplete"]

, data: param

, success:function(msg)

{

_this.event.fileComplete(_this);//触发事件

_this.post_next();

}

, error:function(req, txt, err) { alert("文件-向服务器发送Complete信息错误!"+ req.responseText); }

, complete:function(req, sta) { req =null; }

});

};

这里需要处理一个MD5秒传的逻辑,当服务器存在相同文件时,不需要用户再上传,而是直接通知用户秒传

this.post_complete_quick =function()

{

this.fileSvr.perSvr ="100%";

this.fileSvr.complete =true;

this.ui.btn.stop.hide();

this.ui.process.css("width","100%");

this.ui.percent.text("(100%)");

this.ui.msg.text("服务器存在相同文件,快速上传成功。");

this.Manager.arrFilesComplete.push(this);

this.State =this.Config.state.Complete;

//从上传列表中删除

this.Manager.RemoveQueuePost(this.fileSvr.id);

//从未上传列表中删除

this.Manager.RemoveQueueWait(this.fileSvr.id);

//添加到文件列表

this.post_next();

this.event.fileComplete(this);//触发事件

};

这里可以看到秒传的逻辑是非常 简单的,并不是特别的复杂。

var form = new FormData();

form.append("username","zxj");

form.append("avatar",file);

//var form = new FormData($("#postForm")[0]);

$.ajax({

url:"${pageContext.request.contextPath}/UploadServlet",

type:"post",

data:form,

processData:false,

contentType:false,

success:function(data){

console.log(data);

}

});

java部分

文件初始化的逻辑,主要代码如下

FileInf fileSvr=newFileInf();

fileSvr.id = id;

fileSvr.fdChild =false;

fileSvr.uid = Integer.parseInt(uid);

fileSvr.nameLoc = PathTool.getName(pathLoc);

fileSvr.pathLoc = pathLoc;

fileSvr.lenLoc = Long.parseLong(lenLoc);

fileSvr.sizeLoc = sizeLoc;

fileSvr.deleted =false;

fileSvr.md5 = md5;

fileSvr.nameSvr = fileSvr.nameLoc;

//所有单个文件均以uuid/file方式存储

PathBuilderUuid pb =newPathBuilderUuid();

fileSvr.pathSvr = pb.genFile(fileSvr.uid,fileSvr);

fileSvr.pathSvr = fileSvr.pathSvr.replace("\\","/");

DBConfig cfg =newDBConfig();

DBFile db = cfg.db();

FileInf fileExist =newFileInf();

booleanexist = db.exist_file(md5,fileExist);

//数据库已存在相同文件,且有上传进度,则直接使用此信息

if(exist && fileExist.lenSvr > 1)

{

fileSvr.nameSvr= fileExist.nameSvr;

fileSvr.pathSvr = fileExist.pathSvr;

fileSvr.perSvr = fileExist.perSvr;

fileSvr.lenSvr = fileExist.lenSvr;

fileSvr.complete= fileExist.complete;

db.Add(fileSvr);

//触发事件

up6_biz_event.file_create_same(fileSvr);

}//此文件不存在

else

{

db.Add(fileSvr);

//触发事件

up6_biz_event.file_create(fileSvr);

FileBlockWriter fr =newFileBlockWriter();

fr.CreateFile(fileSvr.pathSvr,fileSvr.lenLoc);

}

接收文件块数据,在这个逻辑中我们接收文件块数据。控件对数据进行了优化,可以方便调试。如果用监控工具可以看到控件提交的数据。

booleanisMultipart = ServletFileUpload.isMultipartContent(request);

FileItemFactory factory =newDiskFileItemFactory();

ServletFileUpload upload =newServletFileUpload(factory);

List files =null;

try

{

files = upload.parseRequest(request);

}

catch(FileUploadException e)

{//解析文件数据错误

out.println("read file data error:"+ e.toString());

return;

}

FileItem rangeFile =null;

//得到所有上传的文件

Iterator fileItr = files.iterator();

//循环处理所有文件

while(fileItr.hasNext())

{

//得到当前文件

rangeFile = (FileItem) fileItr.next();

if(StringUtils.equals( rangeFile.getFieldName(),"pathSvr"))

{

pathSvr = rangeFile.getString();

pathSvr = PathTool.url_decode(pathSvr);

}

}

booleanverify =false;

String msg ="";

String md5Svr ="";

longblockSizeSvr = rangeFile.getSize();

if(!StringUtils.isBlank(blockMd5))

{

md5Svr = Md5Tool.fileToMD5(rangeFile.getInputStream());

}

verify = Integer.parseInt(blockSize) == blockSizeSvr;

if(!verify)

{

msg ="block size error sizeSvr:"+ blockSizeSvr +"sizeLoc:"+ blockSize;

}

if(verify && !StringUtils.isBlank(blockMd5))

{

verify = md5Svr.equals(blockMd5);

if(!verify) msg ="block md5 error";

}

if(verify)

{

//保存文件块数据

FileBlockWriter res =newFileBlockWriter();

//仅第一块创建

if( Integer.parseInt(blockIndex)==1) res.CreateFile(pathSvr,Long.parseLong(lenLoc));

res.write( Long.parseLong(blockOffset),pathSvr,rangeFile);

up6_biz_event.file_post_block(id,Integer.parseInt(blockIndex));

JSONObject o =newJSONObject();

o.put("msg","ok");

o.put("md5", md5Svr);

o.put("offset", blockOffset);//基于文件的块偏移位置

msg = o.toString();

}

rangeFile.delete();

out.write(msg);

注:

1.上面的java部分的代码可以直接使用,只需要将上传的图片路径及收集数据并将数据写入到数据库即可

2.上面上传文件使用到了字节流,其实还可以使用别的流,这个需要读者自己在下面完善测试

3. BeanUtils是一个工具 便于将实体对应的属性赋给实体

4.上传文件不能使用 request.getParameter("")获取参数了,而是直接将request解析,通过判断每一项是文件还是非文件,然后进行相应的操作(文件的话就是用流来读取,非文件的话,暂时保存到一个map中。)

java 上传断点续传_JAVA大文件上传断点续传解决方案相关推荐

  1. asp.net实现ftp上传代码(解决大文件上传问题)

    asp.net实现ftp上传代码(解决大文件上传问题) 参考文章: (1)asp.net实现ftp上传代码(解决大文件上传问题) (2)https://www.cnblogs.com/LYunF/ar ...

  2. java 大文件上传_JAVA大文件上传分片上传方法(附带demo)

    最近在做视频上传展示的相关业务!但是因为最开始使用的是单文件上传所以一旦遇到大文件上传的速度就非常慢!为此在网上一直找寻分片的方法!得到了思路! 直接讲一下我这边看了那么多文档加上自己理解写的demo ...

  3. java大文件 索引_JAVA 大文件上传解决方案(500M以上)

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  4. java图片上传下载_java web 文件上传与下载

    组件工作流程:WEB服务器request ServletFil eupLoad DiskFileItem Factory代表普通字段的FileItem代表上传文件1FileItem代表上传文件2Fil ...

  5. java web 上传附件_JAVA WEB文件上传步骤

    JAVA WEB文件上传步骤如下: 实现 Web 开发中的文件上传功能,两个操作:在 Web 页面添加上传输入项,在 Servlet 中读取上传文件的数据并保存在本地硬盘中. 1.Web 端上传文件. ...

  6. java图片上传下载_Java中文件上传下载 --使用Minio

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...

  7. java 批量上传图片插件_java多文件上传plupload控件实现多图片上传(一)

    使用的是plupload-2.1.2 控件.网上资源挺多的,很好下载. plupload 官方地址 : http://www.plupload.com/ plupload 示例: http://www ...

  8. php大文件上传插件,PHP 大文件上传进度条实现

    目前我知道的方法有两种,一种是使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc),另外一种方法是使用PECL扩 ...

  9. java大文件上传解决方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

最新文章

  1. 进程内COM与进程外COM
  2. [转].NET 数字格式化:忽略末尾零
  3. 2017蓝桥c语言真题,[蓝桥杯][2017年第八届真题]发现环 (C语言代码)------------C语言——菜鸟级...
  4. Angular1.63 绑定数据与继承
  5. STL源码剖析 heap堆结构
  6. Web后端学习笔记 Flask(13)memcached
  7. Spring框架知识要点总结(第一天)
  8. 对称加密、非对称加密深度解析
  9. 10.15. TUI
  10. SpringBoot启动报jdbc连接池错误
  11. 产品思维训练 | 经典产品面试题
  12. java怎么打印课程表_自明排课系统如何打印?教你打印课表的方法
  13. 2D游戏平滑的迷雾战争效果
  14. 计算机原材料费,计算机基础考试原材料
  15. 什么是零信任?零信任的好处有哪些?
  16. 制造上云 佛山南海携手阿里云建创新中心
  17. 货币供应量(年底余额)的意义,如何获取
  18. 使用setoolkit 进行钓鱼攻击
  19. 【论文】caj文件打开方式
  20. r语言进行go富集分析_GO富集柱状图

热门文章

  1. (Activiti6.0.0)SpringProcessEngineConfiguration配置bean时属性注入不了,问题已经找到
  2. 判断输入几位数的正则_判断是几位数,并逆向输出此数的程序算法和说明
  3. python windows系统_Windows系统下Python-Windows详细安装教程
  4. SpringSecurity框架【详解】
  5. 洛谷——P1980 [NOIP2013 普及组] 计数问题
  6. 测试停止线程(Java)
  7. 模型相关:SolidWorks按实际比例创建模型,在Unity中保持尺寸不变
  8. Python之通过url抓取pickle文件
  9. python操作excel命令_python excel操作总结
  10. python 立体匹配_手写双目立体匹配 SGM 算法(下)