① 求web 以上超大文件上传和断点续传服务器的实现
web 以上超大文件上传和断点续传服务器的实现
javaweb上传文件
上传文件的jsp中的部分
上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求
1.通过form表单向后端发送请求
<form id="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="post" enctype="multipart/form-data">
<div class="bbxx wrap">
<inputtype="text" id="side-profile-name" name="username" class="form-control">
<inputtype="file" id="example-file-input" name="avatar">
<button type="submit" class="btn btn-effect-ripple btn-primary">Save</button>
</div>
</form>
改进后的代码不需要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
var loc_path = encodeURIComponent(this.fileSvr.pathLoc);
var loc_len = this.fileSvr.lenLoc;
var loc_size = this.fileSvr.sizeLoc;
var param = jQuery.extend({}, this.fields, this.Config.bizData, { md5: json.md5, id: this.fileSvr.id, lenLoc: loc_len, sizeLoc: loc_size, pathLoc: loc_path, time: new Date().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);
var param = { md5: this.fileSvr.md5, uid: this.uid, id: this.fileSvr.id, time: new Date().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= new FileInf();
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 = new PathBuilderUuid();
fileSvr.pathSvr = pb.genFile(fileSvr.uid,fileSvr);
fileSvr.pathSvr = fileSvr.pathSvr.replace("\\","/");
DBConfig cfg = new DBConfig();
DBFile db = cfg.db();
FileInf fileExist = new FileInf();
boolean exist = 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 = new FileBlockWriter();
fr.CreateFile(fileSvr.pathSvr,fileSvr.lenLoc);
}
接收文件块数据,在这个逻辑中我们接收文件块数据。控件对数据进行了优化,可以方便调试。如果用监控工具可以看到控件提交的数据。
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(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);
}
}
boolean verify = false;
String msg = "";
String md5Svr = "";
long blockSizeSvr = 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 = new FileBlockWriter();
//仅第一块创建
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 = new JSONObject();
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中。)
② web开发中如何上传一个大文件视频
如果想要上传一个大文件、需要使用客户端了。20M之内的文件勉强可以上传,但是由于服务器会默认限制请求大小,所以需要修改相应的配置文件。
③ web的存储技术
引言
随着电网商业化运营的深入开展和电网规模的扩大,电力系统的实时监控、分析决策、信息发布及人员培训等方面的需求水平也越来越高,各部门、人员之间的信息交互也越来越多,越来越频繁,同时要求具有在不同地域对数据的读写功能。信息资源共享及数据的异地读写成为了一个突出的问题。
2 WEB方案的提出
2.1 从对数据的共享需求来看
从数据共享分类大致分为两类:1)只要求对数据进行查询、浏览,属于前台共享;2)需要将数据进行再处理之后使用,属于后台共享。
这里涉及到的需求都可以通过前台共享(WEB模式)来实现。而前台共享实现的方式主要有两种:Client/Server模式 和Browser/Server模式(WEB发布)。现将两种模式的对比如下:
(1)Client/Server模式是传统的解决方案,它在一些传统应用上非常胜任,但对于当今的需求,就有些捉襟见肘。该模式中关系数据库管理系统可处理的并发用户是有限的,不超过50个(一般二三十个并发用户数就可观了)。但随着网络规模的急剧扩大,有许多传统的方法已经不足以应付需求的急剧增长。而采用Browser/Server方式只需要在服务器上建立相应的Web服务程序,对数据库的操作由Web服务器集中完成,不存在并发用户的限制问题。
(2)运用传统的模式,每台客户端机器都必需安装应用软件,造成了软件开发、安装、升级、维护上的大量人力、物力、财力的耗费。而Browser/Server方式在客户端几乎不需要做任何修改,系统软硬件的安装,升级、维护仅集中在服务器端,且Web浏览器具有统一的用户界面,形式简单,操作方便。
(3)Client Server模式在共享区域上也有很大的局限性,它不能打破企业中各信息系统各自为政,互相独立的局面。而Web技术(基于Browser/Server模式)带来了新的企业网络解决方案——Intranet。Intranet是一个以TCP/IP为基础,集成Web技术而形成的企业内部信息网络,主要提供信息服务,避免了信息孤岛现象。企业用户无论在企业内部,还是在家中,甚至在外出差,都可以通过局域网,或通过电话线运用远程访问服务(RAS)进入Intranet,真正实现内部信息的唾手可得。
根据数据面向的访问群范围较广且较分散的特点,我们决定采用Browser/Server模式(即Web发布技术)来实现对数据的共享。
2.2 从对数据读写的类型来看
从数据读写分类也可分为两类:1)数字、字符类型; 2)文件、图表类型。
对于数字、字符类型的读写需求可用WEB模式实现。对文件、图表类型关键在于资料的存储模式。虽然通过人工录入的方式可将数据转录,但通过第三方软件可完美的实现文件的网络存储,不需转化。而此软件的操作管理也是基于WEB服务器模式的,即Web发布技术。
3系统设计思想
我们针对不同的数据存储、读写要求,设计了相应方案。
3.1 关于写入
3.1.1 历史数据处理
(1)不需更新、不需再处理的的数据进行文件扫描、上传处理;
(2)要更新的数据采用WEB服务器进行文件存储,可再次在线编辑;
(3)需处理的数据进行人工录入。
3.1.2 新数据处理
(1)可通过SCADA系统获取实时数据,直接进行自动存储;
(2)须更新的数据采用网页服务器进行文件存储,可再次在线编辑;
(3)不需更新、不需再处理的的数据可进行文件扫描、上传处理;
(4)需处理的数据通过人工录入方式填写。
3.2 关于读取
提供多元化的数据录入、读取样式,能符合各种数据读、写的要求。并且针对不同的录入要求采用相应的录入方式,可节省大量人力。读取方式分两种:
(1)局域网内用户端通过IE直接访问服务器站点;
(2)远程用户通过拨号访问服务器站点。
4 系统技术实现
4.1 WEB结构
Web结构的核心是一台Web 服务器,它一般由一台独立的服务器承担,数据库服务器为信息管理系统数据库服务器,各客户机数据请求均由Web服务器提交给数据库服务器,再由Web服务器返回发给请求的客户机。
这里的Web服务器可设为的内部网,另一端接入企业Intranet,这样既避免了内部网直接暴露于外部,又使内部都可访问到Web站点。
4.2 WEB的软硬平台
大多数Web服务器都是为一种操作系统进行优化的,所以选择Web服务器时,需要和操作系统联系起来考虑。IIS(Internet Information Server)是微软Windows2000/NT自带的Web服务器,具有与操作系统的亲和性,并继承了Microsoft产品一贯的用户界面。所以,我们采用以下Web平台:
(1)硬件:服务器(PII300以上,128MB 以上RAM,100 Mbit/s网卡),客户机(PII200以上64 MB以上RAM,100Mbit/s网卡) ;
(2)软件:服务器(Windows 2000/(NT Server4.0)中文版,建议Server Pack 5.0以上,IIS 4.0 ),客户机(Microsoft Win 9X中文版,IE 4.0以上浏览器) ;
(3)网络:建议为100Mbit/s以太网。
4.3 WEB开发
4.3.1开发工具
(1)ASP是Microsoft用于生态动态网页的技术,它建立在IIS服务器的基础上。在ASP中可以利用ADO方便地实现对数据库的访问。它提供了连接任何兼容ODBC的数据库的能力,通过ODBC连接,从数据库服务器获取数据;执行更新、删除、添加数据,获取ODBC的错误信息等。ASP还支持多种脚本语言,如JavaScript,PerlScript以及VBScript,运用这些脚本语言可以灵活、动态的生成HTML文本。脚本语言还可以方便的调度和控制大量ActiveX控件和Java小程序。即可使ASP相对于原有的CGI技术,具有开发周期短、调试方便、兼容性好、经济易行等特点。所以,在软件制作中,我们采用了ASP技术,并运用Java编制了一些适合自身应用的Applet控件。
(2)以Microsoft 公司出品的SharePoint软件作为网络文件存储的基本结构。可通过WEB页直接进行文件(Word,Excel,PowerPoint,Txt,Html)的网络存储、修改。通过对其中源码的修改,使之适应我们的实际使用情况。同时,对其WEB共享文件夹的安全权限进行设置,达到网络安全的功能。
4.3.2网络用户管理 网络用户的创建是基于服务器的本机用户帐号。所有权限集中于服务器于一身,便于维护人员集中管理。维护人员足不出户就可对每个用户发出命令,允许或禁止用户的读、写操作。为了方便用户修改个人网络帐户及密码,我们通过网络WEB技术提供了系统帐户密码修改页面,使得用户不论身在何处,只要能访问该WEB服务器,就好像在办公室内上班一样方便。
5 系统安全
除了平台、开发环境和功能设计外,网站的安全性问题也不容忽视。从硬件的安全角度考虑,我们为主服务器设置了一台备份服务器,同时将WEB服务器设为网关使用双网卡,对内部机器IP进行合理规划。在软件方面,凡是用于客户端的脚本(主要是响应客户端时间)全部采用JavaScript脚本编写。服务器端脚本(主要是用户权限设置及数据库操作)均采用运行于服务器端的 VbScript脚本编写,ODBC接口及用户权限跟踪进行独特加密。这样,对数据库操作及用户身份验证的脚本在服务器端编译执行,相对于客户端是看不见的,同时传递时进行了多次加密、校验。
在防护上坚持使用正版软件,并时刻注意升级库,做到防患于未然。
6 结语
基于WEB的电网信息管理及办公应用系统不但具有易于开发、使用和维护的特点,而且易于和其他系统接口及协同工作,同时向下和向上兼容过去和将来的办公模式。OFFICE文挡的网络存储和基于网络数据库的数据存储方式,既保留了以前的工作习惯,同时提供了网络数据存储的工作方法。能通过此系统,使得工作人员向完全网络办公模式转化,有一个循序渐进的过程。
④ web服务器可以用来存储大量文件数据吗
如果是零星碎片化的数据文件的话 web服务器是可以使用来存储数据的。但是如果是大量需要上传下载读取等操作的数据的话,还是不建议使用web服务器来存储数据。
原因如下:web服务器本身并不是运行数据存储服务的,大量的文件写入或者读取都会造成带宽的占用,对web服务如打开网页,数据库写入读取 都会造成占用。
解决办法:可以使用网盘来存储大容量的文件数据。目前来说还是比较不错的。还可以自己搭建nas服务来存储数据和文件,通过外网协议把文件共享出来,这种方法需要硬件支持,现成的nas服务设备也很多,如群辉 等 可以解决存储数据的问题。
⑤ 求c#怎么实现web端上传超大文件
课题很大,基本原理是文件切片+服务端存储切片+切片偏移值记忆+切片合并。细节很多,自己找资料看吧。
⑥ java web项目中有很多的图片,如何存放
1.
确实如你所说,基本没有上线的项目会将图片放到webroot,这样重新上线时图片就都会丢失
2.
如果图片不大并且资源很重要可以放在数据库(二机制存储,不常用)
3.
图片可以单独存放在硬盘的某个目录,但不是项目目录下,所以读取图片时都需要文件流来操作(小项目比较多)
4.
对于图片多或者项目比较大的时候就会考虑使用CDN服务器,专门的一个服务来存图片(大项目基本都是)
⑦ 前端怎么实现web端上传超大文件
第一点:系统的配置
⑧ 求php怎么实现web端上传超大文件
加大PHP上传文件大小的限制,是通过修改PHP.INI文件来实现,但是这个支持是有限度的,因为WEB协议本为下载而生,超大文件的上传是FTP的专利。
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。
1.file_uploads=on/off
是否允许通过http方式上传文件
2.max_execution_time=30
允许脚本最大执行时间,超过这个时间就会报错
3.memory_limit=50M
设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此指令只有在编译时设置了
--enable-memory-limit标志的情况下才生效
4.upload_max_filesize=20M
允许上传文件的最大大小,此指令必须小于post_max_size
5.upload_tmp_dir
上传文件临时存放目录
6.post_max_size=30M
允许post方式可以接受最大大小
$_FILES['myFile']['name'] 客户端上次文件的原始名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的状态码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
UPLOAD_ERR_OK
值:0; 没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上传。
UPLOAD_ERR_NO_FILE
值:4; 没有文件被上传。
值:5; 上传文件大小为0.
文件被上传结束后,默认地被存储在了临时目录中,这时您必须将它从临时目录中删除或移动到其它地方,如果没有,则会被删除。
也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除。
附:修改PHP上传文件大小限制的方法
1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.
但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.
这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time
在php.ini里查找
max_execution_time
默认是30秒.改为
max_execution_time = 0
0表示没有限制
2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。
php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空.
查找 post_max_size .改为
post_max_size = 150M
3. 很多人都会改了第二步.但上传文件时最大仍然为 8M.
为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。
查找upload_max_filesize,默认为8M改为
upload_max_filesize = 100M
另外要说明的是,post_max_size 大于 upload_max_filesize 为佳.