jiawei chen
Front-end Engineer
<input type="file" multiple>

IE < 10 , use flash
Android: not support
<input type="file" multiple accept="image/*">

IE < 10, use flash
Android: not support
before preview and upload: check file type (and size)
function preview(file) {
var img = document.createElement('img')
img.src = window.URL.createObjectURL(file)
img.height = 60
img.onload = function(e) {
window.URL.revokeObjectURL(this.src)
}
return img
}more solutions: readAsDataURL etc

IE < 10, use flash
Or, fetch image from server after upload
浏览器端:Canvas

IE < 9, use flash
服务器端:(又拍云)

function uploadFiles(url, files) {
var formData = new FormData()
for (var i = 0, file; file = files[i]; ++i) {
formData.append(file.name, file)
}
var xhr = new XMLHttpRequest()
xhr.open('POST', url, true)
xhr.onload = function(e) { ... }
xhr.send(formData) // multipart/form-data
}
var fileDom = document.querySelector('input[type="file"]')
fileDom.addEventListener('change', function (e) {
uploadFiles('/server', this.files)
}, false)more: progress, load event
tips: upyun do not support to upload multiple files at the same time.

IE < 10, use flash
xhr 跨域:
CORS

IE >= 10, it's OK
flash 跨域:
crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="baixing.com" secure="false"/>
<allow-access-from domain="*.baixing.com" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>
功能都比较完善
支持 纯 HTML5 和 纯 FLASH

uploader = WebUploader.create({
pick: {
id: '#filePicker',
multiple: true
},
accept: {
title: 'Images',
extensions: 'gif,jpg,jpeg,bmp,png',
mimeTypes: 'image/*'
},
swf: BASE_URL + '/js/Uploader.swf'
})
uploader.onFileQueued = function(file) {
uploader.makeThumb(file, function(error, src) {
var img = document.createElement('img')
img.src = src
previewDom.append(img)
}, 100, 100)
}<a class="js-fileapi-wrapper">
<input type="file" id="test" multiple accept="image/*">
</a>
FileAPI.event.on(testDom, "change", function (evt) {
var files = FileAPI.getFiles(evt)
FileAPI.each(files, function (file) {
createPreview(file)
})
})
var createPreview = function (file) {
FileAPI.Image(file).
preview(100).
get(function (err, image) {
if(!err) {
previewDom.appendChild(image)
}
})
}var uploader = WebUploader.create({
...,
auto: true,
server: 'http://webuploader.duapp.com/server/fileupload.php'
})
uploader.on('uploadBeforeSend', function (object, data, header) {
data.policy = policy
data.signature = signature
})
uploader.on('uploadComplete', function(file) {
...
})var uploadOpts = {
url: 'http://v0.api.upyun.com/ustccjw-uploader/',
cache: true,
name: 'file'
}
function uploadFile (file) {
var opts = FileAPI.extend(uploadOpts, {
files: {},
data: {
policy: policy,
signature: signature
},
filecomplete: function (err, xhr, file) {
...
}
})
opts.files[opts.name] = file
FileAPI.upload(opts)
}web uploader: object, config, event
FileAPI: mock standard API
By jiawei chen
This is a internal Sharing of baixing.com about upload encapsulation.