百度开源上传下载组件Xproer松鼠

需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。

第一步:

前端修改

由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify文件上传组件,在项目使用的jslib项目中找到了BJUI框架集成jQueryUploadify的部分,这部分代码封装在bjui-all.js文件中,

在bjui-all.js文件中的全局变量定义中有以下部分代码,这就是定义的有关于上传的Uploadify控件的重要变量:

//文件上传对象

functionFileUploader(fileLoc,mgr)

{

var_this=this;

this.id=fileLoc.id;

this.ui={msg:null,process:null,percent:null,btn:{del:null,cancel:null,post:null,stop:null},div:null};

this.isFolder=false;//不是文件夹

this.app=mgr.app;

this.Manager=mgr;//上传管理器指针

this.event=mgr.event;

this.Config=mgr.Config;

this.fields=jQuery.extend({},mgr.Config.Fields,fileLoc.fields);//每一个对象自带一个fields幅本

this.State=this.Config.state.None;

this.uid=this.fields.uid;

this.fileSvr={

pid:""

,id:""

,pidRoot:""

,f_fdTask:false

,f_fdChild:false

,uid:0

,nameLoc:""

,nameSvr:""

,pathLoc:""

,pathSvr:""

,pathRel:""

,md5:""

,lenLoc:"0"

,sizeLoc:""

,FilePos:"0"

,lenSvr:"0"

,perSvr:"0%"

,complete:false

,deleted:false

};//jsonobj,服务器文件信息

this.fileSvr=jQuery.extend(this.fileSvr,fileLoc);

//准备

this.Ready=function()

this.ui.msg.text("正在上传队列中等待...");

this.State=this.Config.state.Ready;

this.ui.btn.post.click(function(){

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

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

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

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

if(!_this.Manager.IsPostQueueFull()){

_this.post();

}

else{

_this.ui.msg.text("正在上传队列中等待...");

_this.State=_this.Config.state.Ready;

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

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

//添加到队列

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

});

this.ui.btn.stop.click(function(){

_this.stop();

this.ui.btn.del.click(function(){

_this.remove();

this.ui.btn.cancel.click(function(){

//_this.PostFirst();//

};

this.svr_error=function()

alert("服务器返回信息为空,请检查服务器配置");

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

//this.ui.btn.cancel.text("续传");

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

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

this.svr_error_same_name=function(){

this.ui.msg.text("服务器存在同名文件");

this.svr_create=function(sv)

if(sv.value==null)

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

this.svr_error();return;

if(!sv.ret){

this.svr_error_same_name();return;

varstr=decodeURIComponent(sv.value);//

this.fileSvr=JSON.parse(str);//

//服务器已存在相同文件,且已上传完成

if(this.fileSvr.complete)

this.post_complete_quick();

}//服务器文件没有上传完成

else

this.ui.process.css("width",this.fileSvr.perSvr);

this.ui.percent.text(this.fileSvr.perSvr);

this.post_file();

this.svr_update=function(){

if(this.fileSvr.lenSvr==0)return;

varparam={uid:this.fields["uid"],offset:this.fileSvr.lenSvr,lenSvr:this.fileSvr.lenSvr,perSvr:this.fileSvr.perSvr,id:this.id,time:newDate().getTime()};

$.ajax({

type:"GET"

,dataType:'jsonp'

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

,url:this.Config["UrlProcess"]

,data:param

,success:function(msg){}

,error:function(req,txt,err){alert("更新文件进度错误!"+req.responseText);}

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

this.svr_remove=function()

varparam={uid:this.fields["uid"],id:this.fileSvr.id,time:newDate().getTime()};

,url:this.Config["UrlDel"]

,error:function(req,txt,err){alert("删除文件失败!"+req.responseText);}

this.post_process=function(json)

this.fileSvr.lenSvr=json.lenSvr;//保存上传进度

this.fileSvr.perSvr=json.percent;

this.ui.percent.text("("+json.percent+")");

this.ui.process.css("width",json.percent);

varstr=json.lenPost+""+json.speed+""+json.time;

this.ui.msg.text(str);

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.RemoveQueueWait(this.fileSvr.id);

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

,url:_this.Config["UrlComplete"]

,success:function(msg)

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

_this.post_next();

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

this.post_complete_quick=function()

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

//添加到文件列表

this.post_next();

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

this.post_stoped=function(json)

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

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

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

this.ui.msg.text("传输已停止....");

if(this.Config.state.Ready==this.State)

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

return;

this.State=this.Config.state.Stop;

this.Manager.AppendQueueWait(this.fileSvr.id);//添加到未上传列表

//传输下一个

this.post_error=function(json)

this.svr_update();

this.ui.msg.text(this.Config.errCode[json.value]);

this.State=this.Config.state.Error;

//添加到未上传列表

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

this.md5_process=function(json)

varmsg="正在扫描本地文件,已完成:"+json.percent;

this.ui.msg.text(msg);

this.md5_complete=function(json)

this.fileSvr.md5=json.md5;

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

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

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()});

,url:this.Config["UrlCreate"]

,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();

this.md5_error=function(json)

//文件大小超过限制,文件大小为0

if("4"==json.value

||"5"==json.value)

this.post_next=function()

varobj=this;

setTimeout(function(){obj.Manager.PostNext();},300);

this.post=function()

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

if(this.fileSvr.md5.length>0||this.fileSvr.lenSvr>0)

this.check_file();

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});

this.check_file=function()

//this.ui.btn.cancel.text("停止").show();

this.State=this.Config.state.MD5Working;

this.app.checkFile({id:this.fileSvr.id,pathLoc:this.fileSvr.pathLoc});

this.stop=function()

this.app.stopFile({id:this.fileSvr.id});

//手动停止,一般在StopAll中调用

this.stop_manual=function()

if(this.Config.state.Posting==this.State)

this.app.stopFile({id:this.fileSvr.id,tip:false});

//删除,一般在用户点击"删除"按钮时调用

this.remove=function()

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

this.app.delFile(this.fileSvr);

this.ui.div.remove();

if(this.State!=this.Config.state.Complete)this.svr_remove();

upload:{uploadLimit:5,fileSizeLimit:31744,removeTimeout:0.8}

以上三个变量代表的含义是:

uploadLimit:表示上传文件个数的限制,5表示文件上传个数限制是5个

fileSizeLimit:表示上传文件大小的限制,31744单位是KB,也就是表示31M

继续查找使用到这些变量的地方,看到了文件大小超出限制等

了解了BJUI前端框架对于上传大文件的限制,可以这样使用,增大文件上传大小和数量,可以按照如下进行修改,我们在bjui-all.js文件看到uploadLimit属性和fileSizeLimit属性的限制,我们在jsp文件中可以这样进行替换,这里使用的是覆盖原则,重新定义uploadLimit属性和fileSizeLimit属性,覆盖bjui-all.js文件的默认值设置。

bjui-all.js文件的uploadLimit属性和fileSizeLimit属性对应到jsp文件中的属性就应该这样写,data-upload-limit属性和data-file-size-limit属性,只需要在后面改写为data-upload-limit=“800”和data-file-size-limit=“5131264”即可,一定要注意这里的单位是KB,以上数字表示501M。

属性名称

默认值

说明

auto

true

设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传。

buttonClass

按钮样式

buttonCursor

‘hand’

鼠标指针悬停在按钮上的样子

buttonImage

null

浏览按钮的图片的路径。

buttonText

‘SELECTFILES’

浏览按钮的文本。

checkExisting

false

文件上传重复性检查程序,检查即将上传的文件在服务器端是否已存在,存在返回1,不存在返回0

debug

如果设置为true则表示启用SWFUpload的调试模式

fileObjName

‘Filedata’

文件上传对象的名称,如果命名为’the_files’,PHP程序可以用$_FILES['the_files']来处理上传的文件对象。

fileSizeLimit

0

上传文件的大小限制,如果为整数型则表示以KB为单位的大小,如果是字符串,则可以使用(B,KB,MB,orGB)为单位,比如’2MB’;

如果设置为0则表示无限制

fileTypeDesc

‘AllFiles’

这个属性值必须设置fileTypeExts属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileTypeDesc为“请选择rardocpdf文件”

fileTypeExts

‘*.*’

设置可以选择的文件的类型,格式如:’*.doc;*.pdf;*.rar’。

formData

JSON格式上传每个文件的同时提交到服务器的额外数据,可在’onUploadStart’事件中使用’settings’方法动态设置。

height

30

设置浏览按钮的高度,默认值

itemTemplate

用于设置上传队列的HTML模版,可以使用以下标签:instanceID–Uploadify实例的IDfileID–列队中此文件的ID,或者理解为此任务的IDfileName–文件的名称fileSize–当前上传文件的大小插入模版标签时使用格式如:${fileName}

method

Post

提交方式Post或Get

multi

设置为true时可以上传多个文件。

overrideEvents

设置哪些事件可以被重写,JSON格式,如:’overrideEvents’:['onUploadProgress']

preventCaching

如果为true,则每次上传文件时自动加上一串随机字符串参数,防止URL缓存影响上传结果

progressData

‘percentage’

设置上传进度显示方式,percentage显示上传百分比,speed显示上传速度

queueID

设置上传队列容器DOM元素的ID,如果为false则自动生成一个队列容器。

queueSizeLimit

999

队列最多显示的任务数量,如果选择的文件数量超出此限制,将会出发onSelectError事件。注意此项并非最大文件上传数量,如果要限制最大上传文件数量,应设置uploadLimit。

removeCompleted

是否自动将已完成任务从队列中删除,如果设置为false则会一直保留此任务显示。

removeTimeout

3

requeueErrors

如果设置为true,则单个任务上传失败后将返回错误,并重新加入任务队列上传。

successTimeout

swf

‘uploadify.swf’

uploadify.swf文件的相对路径。

uploader

uploadify.php

后台处理程序的相对路径。

uploadLimit

最大上传文件数量,如果达到或超出此限制将会触发onUploadError事件。

width

120

设置文件浏览按钮的宽度。

第二步:

后端修改

基于SpringMVC文件上传组件MultipartResolver接口(核心),使用其中的CommonsMultipartResolver(实现了MultipartResolver接口)这个实现类,CommonsMultipartResolver中的maxUploadSize属性是它继承的抽象父类CommonsFileUploadSupport,这个抽象类其中的一个属性是FileUpload类,而这个类又继承自FileUploadBase这个抽象类,其中它的privatelongsizeMax=-1;就是maxUploadSize属性的最终设置地方。-1表示文件上传大小没有限制,但是我们一般都会设置一个限制值,这里设置的是210763776,这个值的单位是字节,我们将它设置为525336576字节,也就是501M的大小限制。

修改完以上前端和后端,提交修改的代码到git上即可。

第三步:

Nginx配置

进入到项目部署发布所在的Linux下,进入nginx服务器所安装的目录,

进入到nginx服务器所安装的目录

进入到nginx服务器目录下的conf目录

查看nginx.conf配置文件内容中的client_max_body_size配置的大小,这里设置的是300M。

使用vi或者vim打开nginx.conf配置文件,修改client_max_body_size的大小为501M,保存即可

进入到nginx服务器下的sbin目录下,我们使用./nginx-t查看配置文件是否成功使用,然后使用./nginx-sreload重启Nginx服务器即可。

第四步:

Tomcat配置

由于项目使用的是SpringCloud,自然使用SpringBoot,我们这个项目还是使用外置的Tomcat作为他的服务器,便于我们对Tomcat服务器进行优化和设置。

进入到项目使用的Tomcat服务器的目录

进入到指定项目使用的Tomcat服务器的目录

进入到Tomcat服务器下的conf配置目录中

看到server.xml配置文件后

使用vi或者vim打开server.xml配置文件,修改connectionTimeout的大小为2000000,这个属性的单位是毫秒,换算之后大概是半个小时,我们配置缺省的maxPostSize属性的值,默认情况下它的值是2097152,它的单位是字节,也就是2M的大小,修改完保存即可

修改完服务器之后,使用发布工具重新从git上拉取最新的代码和部署发布,重新启动脚本即可完成修改,再次尝试大文件上传,功能基本实现。

以上需要注意的是maxPostSize属性在各个Tomcat版本中的不同

THE END
1.如何找虚拟现实VR海外发稿服务随着科技的飞速发展,虚拟现实(VR)技术日益受到全球关注。国内企业在寻求海外市场拓展时,寻求高质量的VR海外发稿服务显得尤为重要。本文将为您详细介绍如何寻找专业的虚拟现实VR海外发稿服务。 二、关键词布局:理解关键词的重要性 在寻找VR海外发稿服务的过程中,我们需要重点关注关键词。例如,“虚拟现实”、“VR”、“海https://www.mtwanmei.com/index/news-detail-16630.html
2.VR全景如何上传百度地图(百度地图vr实景)VR全景如何上传百度地图 1、不可以直接上传,需要通过第三方平台:全景图上传到百度地图方法:首先,登陆VR云平台(),找到自己的项目,点击三方平台进入提交入口 点击百度POI 进行提交 填写详细资料信息。 百度地图店铺vr全景怎么上传的? 1、全景图上传到百度地图方法步骤:首先,登陆VR云平台(),找到自己的项目,点击三方平台http://www.sidukj.cn/xwzx/11968.html
3.VR全景上传百度地图服务芊云全景于成立于2017年12月,研发团队来自国内顶尖互联网公司, 深耕全景行业多年, 我们有丰富的技术研发及推广经验。芊云全景专注于VR全景在线制作与转播分享, 已取得国家软著证书, 芊云VR全景漫游在线制作与分享平台, 可生成插入公众号的720全景漫游效果,适用于房产,虚拟旅https://vr.he29.com/user/vip/map
4.怎么样将做好的全景图上传到百度地图?百度地图全景上传VR云置顶 文章 虚拟VR 全景学院 设备推荐 常见问题 开通VIP 个人VIP 一站式解决方案 你想从事VR全景行业吗? 想学习拍摄制作VR全景? 想加盟一家VR全景品牌费用太高? 想多渠道展示VR全景? 扫一扫 添加客服 扫一扫 下载APP 商务客服电话: QQ: VR云为用户上传分享产生,若发现您的权利被侵害,请联系,我们会尽快处理APPhttp://school.jsvry.com/article/detail/652
5.天天观察:鄞州东海菜场及其沿街店铺恢复正常经营根据疫情处置工作成效及专家评估研判,经区疫情防控工作领导小组研究决定,自2022年11月19日0时起,恢复东柳街道东海菜场及其沿街店铺的正常经营。 请市民朋友们继续提高防范意识,主动配合落实防控措施,持续做好自我防护和健康监测,全力支持我区疫情防控工作,共同巩固来之不易的防控成果。 http://m.chynews.cn/redian/2022/1119/49652.html
6.山东大学可视计算暑期学校ShandongUniversityVisualComputing暑期学校专家讲座的PPT部分已经上传到百度云盘点我点我和谷歌云盘点我点我,后续的讲座PPT会陆续更新,方便大家下载。 各位同学:暑期学校期间,我们为大家联系好了午餐出售事宜,拉斐尔酒店(15元/两荤两素),19号注册时会在注册处出售餐票,一次出售20-24日餐票。烦请需要购买的老师和同学于2015年7月16日早上8:00前在http://irc.cs.sdu.edu.cn/2015-summer-school/index.html
7.没有主机怎么做自己的网站/市场调研报告word模板开启营销新世界 百度VR营销平台 智能创作 智能创作平台介绍 百度智能创作平台结合了百度领先的自然语言处理和知识图谱技术,可以帮助媒体行业快速生成稿件,帮助编辑收集相关素材,提供写作建议,提高编辑、采编稿件过程的效率和质量,可以帮助企业对内外部数据进行自动分析,对销售数据及行业信息。 http://www.rgdz.cn/news/406333.html
8.百度地图离线开发包百度地图专家百度地图Api 函数及脚本,包含百度地图所有的JS模块 V3.0Api。 立即下载 上传者: chen_chen_silence 时间: 2019-11-19 支持2.0的SteamVR离线开发包 支持2.0的SteamVR离线开发包 包含使用说明及各种配套包支持2.0的SteamVR离线开发包 包含使用说明及各种配套包支持2.0的SteamVR离线开发包 包含使用说明及各种配套https://www.iteye.com/resource/bodown001-9719603
9.VR全景可接入高德地图,全景行业的快速发展业界动态从百度地图接入全景已来,很多做全景行业的同行都在纷纷猜测,高德地图接入全景是迟早的事情,果不然在***近高德已经陆陆续续上线全景。 手机高德地图搜索清华大学,在点击的***个页面中选择右上角VR图标,即可进入VR全景。 高德和百度的区别在于,高德是直接引用的第三方链接,百度地图是直接将全景图上传到自己的服务器http://www.feijuvr.com/index.php?m=content&c=index&a=show&catid=31&id=83
10.百度智能云VR营销购物一站式解决方案天翼云产品百度VR营销平台支持内容的一键上传及发布,支撑VR内容高效批量化生产 全系列VR拍摄硬件支持 可实现大、中、小各品类商品的VR内容快速拍摄及制作 商品动态多维展示 完美还原商品细节,结合多样VR互动玩法,实现精细运营、分层营销 核心价值 “逛”、“导”、“购”一站式VR营销购物解决方案,捕捉真实场景,带来全新、真实的http://ctyun.wuvu.cn/?id=1761
11.百度连续五年入选中国VR50强企业榜单在开幕式上,虚拟现实产业联盟名誉理事长、中国工程院院士赵沁平发布了“2023中国VR 50强企业”名单,百度第五次蝉联此奖项。同时,百度元宇宙底座(MetaStack)获“2023世界VR产业大会VR/AR创新金奖”。 8月,工业和信息化部等5部委联合印发《元宇宙产业创新发展三年行动计划(2023-2025年)》,对元宇宙产业提出了系统谋划和https://www.dsb.cn/230468.html
12.百度VR·AI拍电脑版百度VR·AI拍电脑版下载v1.4.1官方版百度VR·AI拍电脑版是一款3D环物采集_图片采集_环物展示_环物硬件基于人工智能的轻量级VR采集方案软件,伴随用户对商品多样化信息需求的剧增和营销智能化时代的到来,传统电商的静态图文信息展示方式已逐渐被以3D环物为代表的新型交互形式所取代。 软件功能 1、批量图片拍摄 https://www.wmzhe.com/soft-78949.html
13.百度VRAI拍软件(picapture)v1.4.1安装版最需网自动连接全景相机、调整参数、一键拍摄全景素材、上传云端,可在∨R创作中心进一步创作。 3、批量图片拍摄 一秒钟拍摄+抠图+中心矫正,快速制作商品主图;多种拍摄模板,专业单反拍摄效果;自定义批量拍摄,高效省力。 软件特色 1、功能丰富 多种拍摄模式选择,拍摄流程/参数灵活调节;图片/视频/GFH5灵活导出;链接/二维码自由https://www.zuixu.com/down/119313.html
14.百度地图VR全景适合创业吗?AcFun弹幕视频网大流量入口:商家拍摄的全景可以上传百度地图,通过地图标注和搜索直接找到全景店铺,点击瞬间进入商家;通过地图标注和搜索入口为商家带来百万级的流量,让商家不再为客流而发愁,利用百度地图的现有用户量来为商家引流。 在百度地图搜索框中输入商家名称后点击查看内部环境,可直接进入商家VR场景 https://www.acfun.cn/a/ac16995643
15.虚幻引擎游戏VR神器插件UEVR中文版百度网盘免费下载浏览到出现问题的相应游戏文件夹,然后压缩该文件夹并上传给我们。 使用说明 下载UEVR 模组后,您必须启动游戏,然后切换到 UEVR 页面从正在运行的进程列表中选择游戏,在 OpenVR 和 OpenXR 进行一个选择(Quest 设备可以使用第二个 ),如何按注入并返回游戏。https://vr.lxybaike.com/34484.html
16.百度网盘支持哪些VR视频格式?至于如何使用这些格式的VR视频上传到百度网盘,用户只需按照官方提供的步骤进行操作即可。首先,用户需要将VR视频文件上传到他们的设备或云存储服务中(如百度网盘),然后通过百度网盘的客户端进行下载和分享。分享时可以选择分享链接或直接分享到社交媒体平台。需要注意的是,为了保证观看效果,更好在设备上安装合适的播放器或https://www.sousou.com/bk/189402.html