健壮的javascript是否只能上载文件

健壮的javascript是否只能上载文件,javascript,file-upload,Javascript,File Upload,我想要一个健壮的上传文件的方法。这意味着我希望能够处理中断、错误和暂停 因此,我的问题是:是类似于以下的东西,仅在客户端上使用javascript是可能的 如果是这样的话,我想要指向库、教程、书籍或实现的指针。 如果不是,我想解释一下为什么不可能 情景: 打开一个大文件 把它分成几部分 对于每个部分,我都想 创建校验和并附加到数据 将数据发布到服务器(服务器将检查数据是否正确上载) 检查服务器上的网页以查看上载是否正常 如果是,请上载下一部分,如果否,请重试 假设服务器上的所有帖子都附带

我想要一个健壮的上传文件的方法。这意味着我希望能够处理中断、错误和暂停

因此,我的问题是:是类似于以下的东西,仅在客户端上使用javascript是可能的

如果是这样的话,我想要指向库、教程、书籍或实现的指针。 如果不是,我想解释一下为什么不可能

情景:

  • 打开一个大文件
  • 把它分成几部分
对于每个部分,我都想

  • 创建校验和并附加到数据
  • 将数据发布到服务器(服务器将检查数据是否正确上载)
  • 检查服务器上的网页以查看上载是否正常
  • 如果是,请上载下一部分,如果否,请重试

假设服务器上的所有帖子都附带了相关的元数据(sessionid和诸如此类)。

否。通过一定程度的黑客攻击,您可以使用AJAX开始文件上传,在这种情况下,您可以知道文件何时完成上传。就这样


出于安全原因,JavaScript不能直接访问访问者计算机上的文件。从脚本中可以看到的最多的是文件名。

Firefox 3.5添加了支持,允许您跟踪至少上传状态,以及完成取消

还可以在不支持新的
XMLHTTPRequest
添加的客户端中使用iframe模拟进度跟踪


有关实现此功能的脚本示例,请参阅。我已经成功地使用它几个月了。

在Firefox3中,可以打开文件上载字段选择的本地文件,并使用该字段的。这将允许您通过AJAX进行自己的分块、散列和发送


有人说W3会将类似的东西标准化,但在不久的将来,没有其他浏览器支持这一点。

是。请查看以下文件-

function Upload() { var self = this; this.btnUpload; this.frmUpload; this.inputFile; this.divUploadArea; this.upload = function(event, target) { event.stopPropagation(); if (!$('.upload-button').length) { return false; } if (!$('.form').length) { return false; } self.btnUpload = target; self.frmUpload = $(self.btnUpload).parents('form:first'); self.inputFile = $(self.btnUpload).prev('.upload-input'); self.divUploadArea = $(self.btnUpload).next('.uploaded-area'); var target = $(self.frmUpload).attr('target'); var action = $(self.frmUpload).attr('action'); $(self.frmUpload).attr('target', 'upload_target'); //change the form's target to the iframe's id $(self.frmUpload).attr('action', '/trnUpload/upload'); //change the form's action to the upload iframe function page $(self.frmUpload).parent("div").prepend(self.iframe); $('#upload_target').load(function(event){ if (!$("#upload_target").contents().find('.upload-success:first').length) { $('#upload_target').remove(); return false; } else if($("#upload_target").contents().find('.upload-success:first') == 'false') { $('#upload_target').remove(); return false; } var fid = $("#upload_target").contents().find('.fid:first').html(); var filename = $("#upload_target").contents().find('.filename:first').html(); var filetype = $("#upload_target").contents().find('.filetype:first').html(); var filesize = $("#upload_target").contents().find('.filesize:first').html(); $(self.frmUpload).attr('target', target); //change the form's target to the iframe's id $(self.frmUpload).attr('action', action); //change the form's $('#upload_target').remove(); self.insertUploadLink(fid, filename, filetype, filesize); }); }; this.iframe = '' + 'false

' + ''; this.insertUploadLink = function (fid, filename, filetype, filesize) { $('#upload-value').attr('value', fid); } } $(document).ready(event) { var myupload = new Upload(); myupload.upload(event, event.target); } 函数上传(){ var self=这个; 这个.btnUpload; 这个。frmUpload; 这个.inputFile; 这是一个上传区; this.upload=函数(事件、目标){ event.stopPropagation(); 如果(!$('.upload按钮')。长度){ 返回false; } 如果(!$('.form').length){ 返回false; } self.btnUpload=目标; self.frmUpload=$(self.btnUpload).parents('form:first'); self.inputFile=$(self.btnUpload.prev('.upload-input'); self.divUploadArea=$(self.btnUpload).next('.uploadArea'); var target=$(self.frmUpload.attr('target'); var action=$(self.frmUpload.attr('action'); $(self.frmUpload.attr('target','upload_target');//将表单的目标更改为iframe的id $(self.frmUpload.attr('action','/trnUpload/upload');//将表单的操作更改为upload iframe函数页 $(self.frmUpload.parent(“div”).prepend(self.iframe); $(“#上载_目标”).load(函数(事件){ if(!$(“#上传_目标”).contents().find('.upload success:first').length){ $(“#上载_目标”).remove(); 返回false; }else if($(“#上传_目标”).contents().find('.upload success:first')=='false'){ $(“#上载_目标”).remove(); 返回false; } var fid=$(“#上传_目标”).contents().find('.fid:first').html(); var filename=$(“#上传_目标”).contents().find('.filename:first').html(); var filetype=$(“#上传_目标”).contents().find('.filetype:first').html(); var filesize=$(“#上传_目标”).contents().find('.filesize:first').html(); $(self.frmUpload.attr('target',target);//将表单的目标更改为iframe的id $(self.frmUpload.attr('action',action);//更改窗体的 $(“#上载_目标”).remove(); self.insertUploadLink(fid、文件名、文件类型、文件大小); }); }; this.iframe=''+ '假

'+ ''; this.insertUploadLink=函数(fid、文件名、文件类型、文件大小){ $('上传值').attr('值',fid); } } $(文档).ready(事件){ var myupload=新上传(); myupload.upload(事件、事件、目标); } 还可以使用PHP的APC来查询文件上传量的状态,您可以使用定期更新程序创建进度条(我将使用jQuery,上面的类也需要jQuery)。您可以使用PHP输出定期结果和临时创建的iframe中的上载结果


这是不礼貌的。你需要花很多时间才能让它发挥作用。您将需要管理员访问您想要运行它的任何服务器,以便您可以安装APC。您还需要设置HTML表单以对应于js上载类。关于如何做到这一点的参考可以在这里找到

不幸的是,如果您查看noswfupload站点的问题部分,您会发现它显然在FF7中被破坏了