python - curso - django overview



Como enviar um “multipart/form-data” com pedidos em python? (4)

Como enviar um multipart/form-data com solicitações em python? Como enviar um arquivo, eu entendo, mas como enviar os dados do formulário por este método não consegue entender.

https://ffff65535.com


Aqui está o snippet de código simples para fazer upload de um único arquivo com parâmetros adicionais usando solicitações:

url = 'https://<file_upload_url>'
fp = '/Users/jainik/Desktop/data.csv'

files = {'file': open(fp, 'rb')}
payload = {'file_id': '1234'}

response = requests.put(url, files=files, data=payload, verify=False)

Por favor, note que você não precisa especificar explicitamente qualquer tipo de conteúdo.

NOTA: Queria comentar sobre uma das respostas acima, mas não conseguiu, devido à baixa reputação, ter elaborado uma nova resposta aqui.


Aqui está o snippet do Python que você precisa para enviar um único arquivo grande como dados de formulário de várias partes. Com o middleware do NodeJs Multer sendo executado no lado do servidor.

import requests
latest_file = 'path/to/file'
url = "http://httpbin.org/apiToUpload"
files = {'fieldName': open(latest_file, 'rb')}
r = requests.put(url, files=files)

Para o lado do servidor, por favor, verifique a documentação do multer em: https://github.com/expressjs/multer aqui o campo single ('fieldName') é usado para aceitar um único arquivo, como em:

var upload = multer().single('fieldName');

Como as respostas anteriores foram escritas, as solicitações foram alteradas. Dê uma olhada no tópico do bug no Github para mais detalhes e este comentário para um exemplo.

Em suma, o parâmetro files leva um dict com a chave sendo o nome do campo de formulário e o valor sendo uma string ou uma tupla de 2, 3 ou 4-length, conforme descrito na seção POST um arquivo codificado com várias partes no arquivo. solicitações de início rápido:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

Acima, a tupla é composta da seguinte forma:

(filename, data, content_type, headers)

Se o valor for apenas uma string, o nome do arquivo será o mesmo da chave, como segue:

>>> files = {'obvius_session_id': '72c2b6f406cdabd578c5fd7598557c52'}

Content-Disposition: form-data; name="obvius_session_id"; filename="obvius_session_id"
Content-Type: application/octet-stream

72c2b6f406cdabd578c5fd7598557c52

Se o valor for uma tupla e a primeira entrada for None a propriedade filename não será incluída:

>>> files = {'obvius_session_id': (None, '72c2b6f406cdabd578c5fd7598557c52')}

Content-Disposition: form-data; name="obvius_session_id"
Content-Type: application/octet-stream

72c2b6f406cdabd578c5fd7598557c52

Você precisa usar o atributo name do arquivo de upload que está no HTML do site. Exemplo:

autocomplete="off" name="image">

Você vê name="image"> ? Você pode encontrá-lo no HTML de um site para fazer o upload do arquivo. Você precisa usá-lo para fazer o upload do arquivo com Multipart/form-data

roteiro:

import requests

site = 'https://prnt.sc/upload.php' # the site where you upload the file
filename = 'image.jpg'  # name example

Aqui, no lugar da imagem, adicione o nome do arquivo de upload em HTML

up = {'image':(filename, open(filename, 'rb'), "multipart/form-data")}

Se o upload requer clicar no botão para upload, você pode usar assim:

data = {
     "Button" : "Submit",
}

Em seguida, inicie o pedido

request = requests.post(site, files=up, data=data)

E feito, arquivo enviado com sucesso





python-requests