jqueryajax将附件放在CouchDB文档中

jqueryajax将附件放在CouchDB文档中,ajax,jquery,couchdb,couchapp,Ajax,Jquery,Couchdb,Couchapp,我有使用jquery.form.js将附件发布到coach文档的代码。这很好,但我确实需要允许用户在表单中输入多个文件,比如说现在有5个文件,然后在代码中迭代表单中的5个文件,为每个文件创建一个新的coach doc和附件。这是非常困难的,如果不是不可能只使用jQuery。这可以使用coach“内联附件”完成,但是您需要一个服务器端(可能是PHP)脚本来对二进制图像数据进行Base64编码。这真的不是我的选择,因为这是一个Couchapp 因此,下面的代码不起作用,它在jQuery中生成了一个“

我有使用jquery.form.js将附件发布到coach文档的代码。这很好,但我确实需要允许用户在表单中输入多个文件,比如说现在有5个文件,然后在代码中迭代表单中的5个文件,为每个文件创建一个新的coach doc和附件。这是非常困难的,如果不是不可能只使用jQuery。这可以使用coach“内联附件”完成,但是您需要一个服务器端(可能是PHP)脚本来对二进制图像数据进行Base64编码。这真的不是我的选择,因为这是一个Couchapp

因此,下面的代码不起作用,它在jQuery中生成了一个“调用”错误。我的假设是,您不能简单地在数据属性中添加对二进制文件的引用

    var url= _.couchUrl() + me.photoArgs.db +"/" + 
             couchDoc._id + "/attachment?rev=" + couchDoc._rev;
    $.ajax({
        type: "PUT",
        url: url,
        headers: { 
            "Content-Length": file.size,
            "Content-Type": file.type 
        },
        data: file,
        success: function (response) {
            console.log("Attachment was uploaded");
            me.fileCnt--;
            if (me.fileCnt == 0) console.log("Attachment(s) uploaded");
        },
        error: function (response) {
            _.flashError('Attachment ajaxSubmit failed',me,response);
        }
    });
代码是从一个更大的函数中裁剪出来的。我已经记录了url和文件,它们都有正确的数据,所以它们不是问题所在

有人认为上述方法有效吗?如果是,我做错了什么


非常感谢您的建议:-)

您有两种选择:

  • 使用内联附件。您不必使用PHP来解码base64数据:只需将CouchApp
    /\u utils/script/base64.js
    文件(是的,它随CouchDB Futon一起提供)添加为CommonJS模块,就可以了

  • 使用(例如向下滚动一点)。我没有太多使用jQuery快速制作工作原型的经验,但您可能会发现这很有帮助


  • 更新:找到了如何使用多部分API将多个二进制附件上载到CouchDB。

    感谢您的回复。我在沙发上看了base64.js,但这和你想的不一样。它编码/解码base64中的字符串,而不是二进制图像数据。您的(2)示例还依赖于编码为base64的二进制图像blob。@Locohost aha,谢谢您的注释。我想知道PockDB是如何解决这样的问题的,因为它应该很常见。如果我将应用程序从coach(Couchapp)移到一个普通的web应用程序中,我可以使用一个非常简单的PHP脚本来base64二进制图像数据。@Locohost我已经用我发现的新示例更新了帖子:使用多部分api,它将多个附件上传到CouchDB,看起来没有base64的东西-所有图像都应该存储。我确实看到了这个多部分示例并通读了它。问题是,使用Curl进行PUT可能效果很好,因为Curl将在PUT'ing之前基于图像块。jqueryajaxput不能做到这一点。