如何修复此文件上传代码?

时间:2014-09-23 18:53:37

标签: jquery python ajax multipartform-data

我正在努力让一个非常基本的文件上传功能正常工作,并完全失去了发现我做错了什么。大部分代码来自SE。它现在发布到服务器的方式是'[object FormData]',它是一个文本字符串,而不是一个对象。

HTML表单:

    <form id="add-torr" action="/transmission/to_client2" enctype="multipart/form-data" method="post"class="form-inline pull-right">
        <input id="torr-files" type="file" size="30"style="color:#000; background:#ddd" multiple />
        <button id="add-torr-button" type="submit" class="btn btn-primary upload">Upload</button>
    </form>

js:

var form = document.getElementById('add-torr');
form.onsubmit = function(upload){
    upload.preventDefault();
    var uploadButton = document.getElementById('upload-torr-button');
    var data = new FormData();
    jQuery.each($('#torr-files')[0].files, function(i, file) {
        data.append('file-'+i, file);
        //alert(data);
    });
    //alert($('#torr-files').val.text);
    $.ajax({
        url: '/transmission/to_client2/' + data,
        //data: data,
        dataType: 'text',
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        success: function(response){
            alert(response);
        },
        error: function(){
            alert("error in ajax form submission");
        }
    }); 
};

python代码:

#For torrent upload have to be base 64 encode
@cherrypy.expose()
@cherrypy.tools.json_out()
def to_client2(self, info):
    print 'info: ', info
    try:
        self.logger.info('Added torrent info to Transmission from file')
        return self.fetch('torrent-add', {'metainfo': info})
    except Exception as e:
        self.logger.error('Failed to add torrent %s file to Transmission %s' % (info, e))

我知道有很多例子,但我需要一些额外的眼球来告诉我我的代码有什么问题。请帮忙吗?

1 个答案:

答案 0 :(得分:0)

您只是将FormData对象本身添加到网址:

url: '/transmission/to_client2/' + data,

在JavaScript中,当您添加字符串和其他对象时,它会调用该对象的toString方法。不具有toString方法的对象将返回[object MyPrototype]之类的内容。

这里真的没办法了。你不能传递一个对象&#34;作为URL的一部分,因为URL只是字符串。如果要将表单数据作为URL的一部分传递,则必须将其编码为查询字符串(如?key1=value1&key2=value2&…中所述)并将 添加到URL中。

无论如何,即使您已经解决了这个问题,我也希望您不要期望只是将文件名添加到查询字符串中并制作一个没有内容的POST即可上传文件。你必须附上文件&#39;以某种方式对请求的内容(例如,作为MIME多部分);如果您从未发送过该内容,则服务器永远不会收到该内容。