Не можете опубликовать файл, используя Python с POST API? - PullRequest
0 голосов
/ 13 декабря 2018

Я публикую данные с помощью Почтальона, все работает нормально.Но когда я конвертирую его в python, он не может прочитать мой файл.Это дает нулевые данные в файле, я не знаю, что не так.

Вот код Python:

import requests
url = "http://localhost:63387/api/clientdetail"
payload = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; " \
      "name=\"ip\"\r\n\r\n10.2.3.5\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; " \
      "name=\"file\"; filename=\"D:\\data.json\"\r\n" \
      "Content-Type: application/json\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
'cache-control': "no-cache",
'Postman-Token': "adcea715-e97c-4374-80b7-30094e0861c3"
}
response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

Я копирую это из почтальона.здесь я передаю строку с двумя параметрами и файл, поэтому строка работает нормально, но файл выдает ноль.

, и когда я делаю это с помощью почтальона, он дает оба правильных значения

, так что кто-нибудь может мне помочь ???

Вот код HTTP почтальона

POST /api/clientdetail HTTP/1.1
Host: localhost:63387
cache-control: no-cache
Postman-Token: d614bdb0-eadd-4d29-9132-bc9443176082
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="ip"
10.2.3.5
Content-Disposition: form-data; name="file"; filename="D:\data.json"
------WebKitFormBoundary7MA4YWxkTrZu0gW--

1 Ответ

0 голосов
/ 13 декабря 2018

Единственное, что мешает вам использовать urlopen непосредственно для файлового объекта, это тот факт, что во встроенном файловом объекте отсутствует определение len.Простой способ - создать подкласс, который обеспечивает urlopen правильным файлом.Я также изменил заголовок Content-Type в файле ниже.

import os
import urllib2
class EnhancedFile(file):
    def __init__(self, *args, **keyws):
        file.__init__(self, *args, **keyws)

    def __len__(self):
        return int(os.fstat(self.fileno())[6])

theFile = EnhancedFile('a.xml', 'r')
theUrl = "http://example.com/abcde"
theHeaders= {'Content-Type': 'text/xml'}

theRequest = urllib2.Request(theUrl, theFile, theHeaders)

response = urllib2.urlopen(theRequest)

theFile.close()


for line in response:
    print line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...