【问题标题】:POST file in request body to API将请求正文中的文件 POST 到 API
【发布时间】:2019-06-13 11:10:24
【问题描述】:

我正在尝试在 API 中上传一个文件,该 API 仅显示:

请求 请求正文应包含文件的内容。 https://developer.fortnox.se/documentation/resources/inbox/

到目前为止我已经尝试过:

headers = {
      "Access-Token": settings.FORTNOX_ACCESS_TOKEN,
      "Client-Secret": settings.FORTNOX_CLIENT_SECRET,
      "Content-Type": "multipart/form-data",
      "Accept": "application/json",
}

file = open(invoice.file.path, 'rb').read()
r = requests.post("https://api.fortnox.se/3/inbox", data=file, headers=headers)

这给了我一个错误:

Ingen fil var uppladdad。 (没有上传文件)

headers = {
      "Access-Token": settings.FORTNOX_ACCESS_TOKEN,
      "Client-Secret": settings.FORTNOX_CLIENT_SECRET,
      "Content-Type": "multipart/form-data",
      "Accept": "application/json",
}

h = httplib2.Http()
file = open(invoice.file.path, 'rb').read()
resp, content = h.request('https://api.fortnox.se/3/inbox', "POST", body=file, headers=headers)

这给了我同样的错误:

Ingen fil var uppladdad。 (没有上传文件)

还有其他方法可以将文件添加到请求正文中,还是我在这里做错了什么?

感谢您的帮助。

【问题讨论】:

    标签: python python-requests httplib


    【解决方案1】:

    根据 mee 的回答,我终于让它工作了。这成功了:

    multipart_data = MultipartEncoder(
        fields={
            'file': (invoice.file.path, open(invoice.file.path, 'rb'), 'text/plain')
        }
    )
    
    headers = {
      "Access-Token": settings.FORTNOX_ACCESS_TOKEN,
      "Client-Secret": settings.FORTNOX_CLIENT_SECRET,
      "Content-Type": multipart_data.content_type,
      "Accept": "application/json",
    }
    
    r = requests.post("https://api.fortnox.se/3/inbox", headers=headers, data=multipart_data)
    

    【讨论】:

      【解决方案2】:

      就我而言,我能够像这样从 put 请求上传文件:

      import requests
      from requests_toolbelt.multipart.encoder import MultipartEncoder
      def upload_localfile(filepath,server_data):
        multipart_data = MultipartEncoder(
          fields={
                  'file': (filepath, open(filepath, 'rb'), 'text/plain')
                 }
          )
        response=requests.put(
          server_data, 
          data=multipart_data,
          headers={'Content-Type': multipart_data.content_type}
          )
      

      【讨论】:

      • 感谢您的回复。我试过这个:multipart_data = MultipartEncoder(fields={'file': (invoice.file.path, open(invoice.file.path, 'rb'), 'text/plain')})requests.post("https://api.fortnox.se/3/inbox", data=multipart_data, headers=headers) 但我仍然收到 No file was upload-error。
      【解决方案3】:

      您应该将此实现用于 fortnox:

          files = [
              ('file', ('somename.pdf', data.file -> NamedTemporaryFile in my case))
          ]
          response = requests.post(
              url,
              headers={"Authorization": f"Bearer {token}",}
              data={},
              files=files,
          )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        相关资源
        最近更新 更多