Gostaria de usar o cURL não apenas para enviar parâmetros de dados no HTTP POST, mas também para enviar arquivos com nome de formulário específico. Como devo fazer isso?
Parâmetros de postagem HTTP:
userid = 12345 filecomment = Este é um arquivo de imagem
Upload de arquivo HTTP: local do arquivo = /home/user1/Desktop/test.jpg Nome do formulário para file = image (corresponde a $ _FILES ['image'] no lado do PHP)
Imaginei parte do comando cURL da seguinte maneira:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
O problema que estou recebendo é o seguinte:
Notice: Undefined index: image in /var/www/uploader.php
O problema é que estou usando $ _FILES ['image'] para pegar arquivos no script PHP.
Como ajusto meus comandos cURL de acordo?
-d
opção por engano, que precisa da entrada codificada em URL. Eu deveria ter removido isso quando atualizei a resposta para a-F
opção. Obrigado por capturar isso.@
inimage=@/..
?Captura do ID do usuário como variável de caminho (recomendado):
Captura do ID do usuário como parte do formulário:
ou:
fonte
"Content-Type: multipart/form-data"
Aqui está a minha solução: eu tenho lido muitos posts e eles foram realmente úteis. Finalmente, escrevi um código para arquivos pequenos, com cURL e PHP, que acho realmente útil.
Com isso, devemos entrar no "api.endpoint.post", os seguintes vars postados. Você pode testar facilmente com este script e deve receber este debuga na função
postFile()
na última linha.Deverá funcionar bem, elas podem ser melhores soluções, mas isso funciona e é realmente útil para entender como o mime Boundary e multipart / from-data funciona na biblioteca PHP e cURL.
fonte
se você estiver fazendo upload de arquivo binário, como csv, use o formato abaixo para fazer upload de arquivo
fonte
--data-binary
instruicurl
a não fazer nenhum pré-processamento dos dados, em vez de--data
sinalizar. Para endereçar seu comentário diretamente, observe que o texto também é binário, mas podemos interpretá-lo como caracteres ASCII. Se você realmente deseja um exemplo distinto, pense em um CSV cujos campos contenham emoticons. Seus bytes não mapear diretamente ao textoO problema que me levou aqui acabou sendo um erro básico do usuário - eu não estava incluindo o
@
sinal no caminho do arquivo e, portanto, o curl estava postando o caminho / nome do arquivo em vez do conteúdo. OContent-Length
valor foi, portanto, 8 em vez dos 479 que eu esperava ver, dada a extensão do meu arquivo de teste.O
Content-Length
cabeçalho será calculado automaticamente quando o curl ler e publicar o arquivo.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Comprimento do conteúdo: 479 ...
Publique isso aqui para ajudar outros iniciantes no futuro.
fonte
Como alternativa
curl
, você pode usar o HTTPie , uma CLI, uma ferramenta semelhante ao cURL para humanos.Instruções de instalação: https://github.com/jakubroztocil/httpie#installation
Então corra:
fonte
Depois de muitas tentativas, este comando funcionou para mim:
fonte
Aqui está como escapar corretamente os nomes de arquivos arbitrários dos arquivos enviados com
bash
:fonte
Eu trabalhei com este comando
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
fonte