如何发送通过javascript上传的文件,并使其在Flask应用中接收并作为后期请求发送到另一台服务器?

时间:2019-08-02 00:42:54

标签: javascript python rest flask

当我尝试使用文件(从客户端通过ajax请求接收到的文件)从flask发送发帖请求时,我遇到了一个例外:“要解压缩的值太多(预期2)

  1. 我有一个客户端应用程序,可以上传文件(JavaScript)。
  2. 我有我的服务器代码,可以作为代理处理所有外部服务器调用。上载的文件作为来自客户端的发帖请求发送到此服务器。
  3. 现在,我需要使用python中的请求模块将服务器中接收到的该文件作为发布请求发送到外部服务器。

我在执行步骤3时遇到异常。 我不确定这是否是发布此类文件的正确方法,因为我是不熟悉烧瓶的人。请提供一些可能有用的输入。

  1. 客户端代码

    $('input[type="file"]').change(function (e) {
    var formData = new FormData(e.target.files[0]);
    var fileName = e.target.files[0].name;
    var fileType = e.target.name;
    
    var settings = {
        "async": true,
        "crossDomain": true,
        "url": "/upload?file_name="+fileName+"&file_type="+fileType,
        "method": "POST",
        "contentType": false,
        "cache": false,
        "processData": false,
        "data": formData
      };
    
      $.ajax(settings).done(function (response) {
        console.log(response);
      });
    });
    
  2. 烧瓶代码

@app.route('/upload', methods=['GET','POST'])
    def uploadToExternalServer():
        if request.method == "POST":
            try:
                file_content=request.files['file']
                file_type= request.args.get('file_type')
                file_name= request.args.get('file_name')
                url="url to post with params"
                response = requests.post(url, auth=('usr', 'pwd!'),files=file_content)   
                return r
            except Exception as e:
                logging.info(e.args[0])

Expected:

应该能够将文件成功发布到外部服务器

Actual:

在请求后获取异常的原因是:“要解压缩的值太多(预期2)

1 个答案:

答案 0 :(得分:0)

检查Requests的文档

我认为您的问题是,您正在尝试将文件像对象一样传递,而param需要字典。

  

文件 –(可选)“名称”:类文件对象(或{'名称”:file-tuple})的字典,用于分段编码上传。文件元组可以是2元组(“文件名”,fileobj),3元组(“文件名”,fileobj,“ content_type”)或4元组(“文件名”,fileobj,“ content_type”,custom_headers),其中“ content-type”是一个字符串,用于定义给定文件的内容类型,而custom_headers是一个类似dict的对象,其中包含要为该文件添加的其他标题。