如何从浏览器上传文件(附件)?

Aro*_*ost 10 couchdb

我没有获得附件上传以使浏览器正常工作.

这里一些提示,其他提示.文档非常好,但我无法将其转换为AJAX上传.

我正在寻找一个超级简单的HTML/JavaScript示例(有或没有jQuery)如何将文件从(相对现代的)浏览器上传到数据库而不使用jquery.couch.app.js包装或东西.besser越简单.

任何帮助赞赏.

Oct*_*ean 18

好的,这是您的纯JavaScript文件上传实现.

基本算法是这样的:

  1. 从文件输入元素获取文件
  2. 获取文件名并键入文件对象
  3. 获取要将文件附加到的文档的最新文档修订版
  4. 使用提取的修订将文件附加到文档

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请求标头中使用适当的内容类型.

注意:我很清楚我在这里根本没有使用防御性编程,为了简洁,我故意这样做.