1.html表单上传(不推荐)
最传统的图片上传方式是form表单上传,使用form表单的input[type=”file”]控件,打开系统的文件选择对话框,从而达到选择文件并上传的目的。
form表单上传。表单上传需要注意以下几点:
1、.提供form表单,method必须是post。
2、form表单的enctype必须是multipart/form-data。
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码。HTML表单如何打包数据文件是由enctype这个属性决定的。
enctype有以下几种取值:
aplication/x-www-form-urlencoded:在发送前编码所有字符(默认)(空格被编码为’+’,特殊字符被编码为ASCII十六进制字符)。
multipart/form-data:不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain:空格转换为 “+” 加号,但不对特殊字符编码。
默认enctype=application/x-www-form-urlencoded,所以表单的内容会按URL规则编码,
2.Ajax无刷新上传(jquery---ajax上传)
ajax和FormData可实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口。通过FormData对象可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过submit()方法传输的数据格式相同。
Ajax无刷新上传的方式,本质上与表单上传无异,只是把表单里的内容提出来采用ajax提交,并且由前端决定请求结果回传后的展示结果。
<form>
<input id="file" name="file" type="file" />
<input id="token" name="token" type="hidden" />
</form>
$("#file").on("change", function(){
var formData = new FormData();
formData.append("file", $("#file")[0].files);
formData.append("token", $("#token").val());
$.ajax({
url: "http://uploadUrl",
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(response){
// 根据返回结果指定界面操作
}
});
});
我们使用了file
控件的change
来触发上传事件,当然你也可以使用某个按钮来触发表单提交。提交数据时,用到了FormData
对象来发送二进制文件,FormData
构造函数提供的append()
方法,除了直接添加二进制文件还可以附带一些其它的参数, 作为XMLHttpRequest
实例的参数提交给服务端。
使用jQuery提供的ajax方法来发送二进制文件,还需要附加两个参数:
processData
: false // 不要对data参数进行序列化处理,默认为truecontentType
: false // 不要设置Content-Type请求头,因为文件数据是以 multipart/form-data 来编码
3.web文件上传插件 Web Uploader ---- 支持多图上传,大文件上传,压缩图片上传,预览等
官网 : http://fex.baidu.com/webuploader/
各类插件上传
当上传的需求要求可预览、显示上传进度、中断上传过程、大文件分片上传等等,这时传统的表单上传很难实现这些功能,我们可以借助现有插件完成。
如百度上传插件Web Uploader、jQuery图片预览插件imgPreview 、拖拽上传与图像预览插件Dropzone.js等等,大家可根据项目实际需求选择适合的插件。