Oct*_*ean 18
好的,这是您的纯JavaScript文件上传实现.
基本算法是这样的:
HTML部分基本上由一个带有两个元素的简单表单,一个类型的输入file和一个类型的按钮组成submit.
<form action="/" method="post" name="upload">
<input type="file" name="file" />
<button type="submit" name="submit">Upload</button>
</form>
Run Code Online (Sandbox Code Playgroud)
现在到JavaScript部分.
window.onload = function() {
var app = function() {
var baseUrl = 'http://127.0.0.1:5984/playground/';
var fileInput = document.forms['upload'].elements['file'];
document.forms['upload'].onsubmit = function() {
uploadFile('foo', fileInput.files[0]);
return false;
};
var uploadFile = function(docName, file) {
var name = encodeURIComponent(file.name),
type = file.type,
fileReader = new FileReader(),
getRequest = new XMLHttpRequest(),
putRequest = new XMLHttpRequest();
getRequest.open('GET', baseUrl + encodeURIComponent(docName),
true);
getRequest.send();
getRequest.onreadystatechange = function(response) {
if (getRequest.readyState == 4 && getRequest.status == 200) {
var doc = JSON.parse(getRequest.responseText);
putRequest.open('PUT', baseUrl +
encodeURIComponent(docName) + '/' +
name + '?rev=' + doc._rev, true);
putRequest.setRequestHeader('Content-Type', type);
fileReader.readAsArrayBuffer(file);
fileReader.onload = function (readerEvent) {
putRequest.send(readerEvent.target.result);
};
putRequest.onreadystatechange = function(response) {
if (putRequest.readyState == 4) {
console.log(putRequest);
}
};
}
};
};
};
app();
};
Run Code Online (Sandbox Code Playgroud)
基本上,我submit通过将自己的函数绑定到表单的onsubmit事件并返回false 来拦截表单的事件.
在那个事件处理程序中,我用两个参数调用我的main函数.第一个是文档名称,第二个是要上载的文件.
在我的uploadFile()函数中,我设置文件名,文件类型并获取一些实例.第一个HTTP请求是获取文档当前版本的GET请求.如果该请求成功,我通过设置先前获得的修订,正确的内容类型然后将文件转换为ArrayBuffer来准备PUT请求(实际上载请求).一旦完成,我只是发送我刚准备的HTTP请求,然后我放松.
独立附件上载方案如下所示:
PUT host/database/document/filename?revision=latest-revision
Run Code Online (Sandbox Code Playgroud)
当然在HTTP请求标头中使用适当的内容类型.
注意:我很清楚我在这里根本没有使用防御性编程,为了简洁,我故意这样做.