2015-04-21 15 views
5

Tôi muốn gửi tệp theo yêu cầu POST sử dụng thư viện Yêu cầu của Python, bằng Python 3. Tôi đang cố gắng gửi nó như vậy:Cách tải lên tệp văn bản bằng cách sử dụng Python-Requests mà không cần ghi vào đĩa

import requests 

file_content = 'This is the text of the file to upload' 

r = requests.post('http://endpoint', 
    params = { 
     'token': 'api_token', 
     'message': 'message text', 
    }, 
    files = {'filename': file_content}, 
) 

Máy chủ phản hồi rằng không có tệp nào được gửi. Công việc này có nên không? Hầu hết các ví dụ liên quan đến việc truyền một đối tượng tệp, nhưng tôi không muốn phải viết chuỗi ra đĩa chỉ để tải nó lên.

Trả lời

1

Hóa ra, lý do nó không hoạt động không liên quan gì đến nội dung tệp, mà đúng hơn là tôi đã gửi yêu cầu qua HTTP, thay vì HTTPS, mất toàn bộ yêu cầu.

4

Tại sao không sử dụng cStringIO?

import requests, cStringIO 

file_content = 'This is the text of the file to upload' 

r = requests.post('http://endpoint', 
    params = { 
    'token': 'api_token', 
    'message': 'tag_message', 
    }, 
    files = {'filename': cStringIO.StringIO(file_content)}, 
) 

Tôi nghĩ rằng requests sử dụng một số phương pháp tương tự như phương pháp chúng tôi sử dụng với tệp. cStringIO cung cấp cho họ.


Ví dụ về việc sử dụng

>>> from cStringIO import * 
>>> a=StringIO("hello") 
>>> a.read() 
'hello' 
+1

Cảm ơn đề xuất. Vì tôi đang sử dụng Python 3, mặc dù, nó nằm trong mô-đun 'io':' io.StringIO' – Dov

4

Các requests docs cung cấp cho chúng với điều này:

Nếu bạn muốn, bạn có thể gửi chuỗi để được nhận dưới dạng file:

>>> url = 'http://httpbin.org/post' 
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} 

>>> r = requests.post(url, files=files) 
>>> r.text 
{ 
    ... 
    "files": { 
    "file": "some,data,to,send\\nanother,row,to,send\\n" 
    }, 
    ... 
} 

Tôi đăng nó như một câu trả lời khác vì nó liên quan đến một cách tiếp cận khác nhau.

+0

Cảm ơn, tôi đã bỏ lỡ điều đó trong tài liệu. – Dov

+0

Đẹp! Cảm ơn, cần phải viết một số bài kiểm tra, thay đổi tên/dữ liệu mỗi lần. – rprasad

Các vấn đề liên quan