首页 > 其他分享 >使用HTML5实现多文件上传

使用HTML5实现多文件上传

时间:2023-12-26 14:36:36浏览次数:37  
标签:文件 插件 form dojox HTML5 Uploader 上传

入门

File input之所以叫file input是因为它是一个标准的input元素,且其type属性被设置为"file"。很多年以来,file input一次只能选择并上传单个文件。在新的HTML5规范中为input元素添加了多选模式。当然,不同浏览器对于规范的实现一直以来都不尽相同。比如,Firefox3.6和WebKit以及Firefox4.0就不同。或许你已经猜到了,IE并没有实现HTML5中多文件上传这一功能...甚至IE9也没有实现。

!dojox.form.Uploader相对于dojox.form.FileUploader做出了很多改进,并将取代后者。由于新的dojox.form.Uploader在Mozilla和Webkit浏览器下并不适用Flash,因此许多由于使用Flash而引起的问题得到了规避。Dojo 1.6之后不再会继续对于dojox.form.FileUploader提供维护,但是该控件代码会一直保留到Dojo 2.0之前。

为了应付Dojo开发者需要面对的各种情况, 真正的“上传功能”其实是由插件实现的。离开了这些插件,Uploader的代码允许对file input进行样式定制,并在不支持HTML5的浏览器中通过为每一个文件的选择添加一个新的file input元素来实现多文件的选择。这所有的一切只需要为一个普通的file input添加dojoType属性:

<input type="file" multiple="true" dojoType="dojox.form.Uploader"
label="Select Some Files" url="/tests/UploadFile.php"
uploadOnSelect="true"/>

上述代码将会生成一个使用你所选择的Dijit样式的上传文件按钮。这里我们默认使用Claro主题:

 

注意,若是要使用Ajax来上传文件的话,你还需要一个Uploader插件,之后我会说明这一点。

除了使用Ajax上传文件,这个Uploader也可能被放在一个form表单中直接上传文件。使用时记得将你的form表单的enctype属性设置为multipart/form-data,该属性是用来上传文件的。

<form method="post" action="/tests/UploadFile.php" id="myForm"
enctype="multipart/form-data" >
<fieldset>
<legend>Form Post Test</legend>
<input class="browseButton" name="uploadedfile" multiple="true"
type="file" dojoType="dojox.form.Uploader"
label="Select Some Files" id="uploader" />
<input type="text" name="album" value="Summer Vacation" />
<input type="text" name="year" value="2011" />
<input type="submit" label="Submit" dojoType="dijit.form.Button" />
</fieldset>
</form>

 

上述代码的结果如下:

 

需要重复的是,不使用插件的话,你需要自己实现真正的文件上传部分。

尽管上一个例子可以上传多个文件,但并没有可视化界面告诉你到底选择了哪些文件。为此,dojo还提供了dojox.form.uploader.FileList这个帮助控件。该帮助控件可以被绑定到一个dojox.form.Uploader控件上,这样它就可以自动侦测哪些文件被选择或是移除又或是上传并实时地在界面上将对应状态表示出来。在使用Ajax上传时,该控件还提供一个内置的进度条来显示上传进度。

<form method="post" action="UploadFile.php" id="myForm"
enctype="multipart/form-data" >
<fieldset>
<legend>Form Post Test</legend>
<input name="uploadedfile" multiple="true" type="file" id="uploader"
dojoType="dojox.form.Uploader" label="Select Some Files" >
<input type="text" name="album" value="Summer Vacation" />
<input type="text" name="year" value="2011" />
<input type="submit" label="Submit" dojoType="dijit.form.Button" />
<div id="files" dojoType="dojox.form.uploader.FileList"
uploaderId="uploader"></div>
</fieldset>
</form>

!注意, FileList有一个自定义属性指向所要绑定的Uploader控件,如上述代码中11行所示。

 

结果如下:

 

插件

Uploader有种插件可以用来处理Ajax上传。HTML5插件通过Gecko(Firefox)和WebKit(Safari,Chrome)浏览器中file input的新类型来实现上传。在IE下你有两种选择:IFrame插件或是Flash插件。这两个插件并没有任何新的东西,实质上它们重用了以前的FileUploader中的代码,并进行了简化。

IFrame和Flash插件扩展了HTML5插件,因此你不需要在你的项目中同时导入两者。如你所想的那样,只有当你在开发一个不用兼容IE的项目时(你太幸运了!)才会单独使用HTML5插件。

在之前的例子中,页面在递交时会通过post方式来将页面信息传递给UploadFile.php。如果我们需要使用Ajax来实现的话,只需要导入IFrame和Flash插件之一即可:

 

dojo.require("dojox.form.uploader.plugins.Flash");
如果你不希望在IE下使用Flash的话,你可以使用IFrame插件:

 

 

dojo.require("dojox.form.uploader.plugins.IFrame");
等一下,之前的例子使用的是简单的form表单,并没有使用任何插件;而现在用的这些插件是为了在IE下运行Ajax上传的,所谓的HTML5插件到底在哪里?

 

如我之前所说的,Flash和IFrame插件扩展了HTML5插件,因此它已经被包含在这两个插件里并会自动工作。不过如果你确信你不会使IE...甚至是IE9这样不支持HTML 5表单功能的浏览器的话,你可以用以下方式直接使用HTML5插件:

 

dojo.require("dojox.form.uploader.plugins.HTML5");
不管是哪种方式,一切都会被自动处理。当按下“Submit”按钮时,Uploader将会阻断onsubmit事件,因此页面不会进行跳转,之后它会从action属性中获取URL信息,并收集form表单中的数据传递到服务器端。

 

结论

得益于几年在FileUploader上的工作经验,我才能将这个新的Uplaoder做的简单易用、功能齐备。之前在FileUploader上的工作曾因为Flash插件在除了IE之外的浏览器上表现并不是那么变得很难维护。尽管FileUploader跑起来没有大问题,但在与Dijit Tabs或是Dijit Dialog等控件一起使用时还是经常会有一些诡异bug。现在有了HTML5的新功能,Firefox和WebKit下新的Multi-File Input得以有效的工作,同时由于这都是原生的HTML元素,也不会有任何渲染问题。

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/26/%e4%bd%bf%e7%94%a8html5%e5%ae%9e%e7%8e%b0%e5%a4%9a%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/

欢迎入群一起讨论

 

 

标签:文件,插件,form,dojox,HTML5,Uploader,上传
From: https://www.cnblogs.com/songsu/p/17928041.html

相关文章

  • windows 操作文件
       Windows操作系统允许用户同时打开同一文本文件的多个实例,主要原因是记事本程序的设计与操作系统的文件访问机制。首先,我们先来看记事本程序的设计。当你在记事本中打开一个文件时,它会将文件的内容读入内存,并在内存中进行编辑。这意味着,实际上你在编辑的不是文件本身,而......
  • 运行js文件,会弹出一个python解释器的界面,怎么解决呢?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【菜......
  • Shell脚本实现SFTP传输文件,通过密码形式
    读取SFTP连接信息cat读取文件内容grepserver:查找文件内容中包含server字符的,行内容awk-F‘=’:实现字符串分割,分割字符’‘=’${print$2}:其中$2表示切割后数组中第几值base-d:解码base64字符串,转为可识别字符串#sftp配置文件sftp_conf_path=/etc/sftp.conf#获取sft......
  • cython,将py文件编译成pyd/so文件
    在windows下使用cythonize可以将py文件编译成pyd,这样就完成了初步的python代码加密工作使用前需要先安装CythonpipinstallCython然后对py文件执行命令cythonize-i-3--directivealways_allow_keywords=truexxx.py这里有一个要注意的点:--directivealways_allow_keywor......
  • 写一个MATLAB脚本删除一个.m文件的所有注释,输出到一个新.m文件,文件名加上_modified后
    请注意,这个脚本仅处理了最简单的情况,真正的Matlab代码可能包含更复杂的结构,如多行字符串、嵌套的字符串、转义字符等,处理这些情况可能需要更复杂的逻辑。clearall;closeall;clc;%Specifytheinput.mfilenameinputFileName='originalScript.m';outputFileName=[inpu......
  • LiveGBS流媒体平台GB/T28181常见问题-配置国标流媒体服务日志文件个数及记录时长配置l
    LiveGBS流媒体平台GB/T28181常见问题-如何配置国标流媒体服务日志文件个数及记录时长1、日志文件2、配置日志文件个数及记录时间3、配置日志文件路径4、相关问题4.1、如何关闭信令日志?5、搭建GB28181视频直播平台1、日志文件部署LiveGBS后,LiveCMS和LiveSMS的解压目录下都个l......
  • VS2019,无法启动程序xxx.exe,系统找不到指定的文件,重新生成解决方案报错
     调试程序报错如图一、尝试重新生成解决方案二、如果生成解决方案也报错,重新安装.netSDK本人所用为VS2019,.net5,到官网下载.net5的SDK重新安装后,恢复正常,重新生成成功,启动调试成功。.net各版本下载地址:https://dotnet.microsoft.com/en-us/download/dotnet.net5下载地址:h......
  • JavaWeb - Day11 - 案例 - 员工管理、文件上传、修改员工、配置文件
    01.案例-员工管理-新增员工前面我们已经实现了员工信息的条件分页查询以及删除操作。关于员工管理的功能,还有两个需要实现:新增员工修改员工首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在"新增员工"中,需要添加头像,而头像需要用到"文件上传"技......
  • HTML5 文件上传的2种方式
    以前上传文件需要提交Form表单。HTML5方式上传文件,可以通过使用FormData类模拟Form表单提交,从而实现无刷新上传文件。 假设有一个文件选择框<inputtype="file"name="pic"id="pic"accept="image/gif"/>有下面2种方式上传文件:1、XMLHttpRequest(有进度事件)varfiles=d......
  • .Net 利用Aspose.Words在上传word时将.doc转为.docx
    1、引用包Aspose.Words2、接口中使用:ListformFiles=new();foreach(IFormFileformFileinformCollection.Files){if(formFile.ContentType=="application/msword"){Streamfs=formFile.OpenReadStream();vardoc=newAspose.Words.Document(fs);Stream......