Como posso carregar um arquivo usando 'curl' em vez do formulário?

0

Eu tenho um cliente cujo cliente usa uma câmara de compensação de terceiros para receber faturas. Podemos fazer isso manualmente exportando nossos dados para XML, indo para um site específico e carregando o arquivo. O formulário HTML relevante é assim:

<form border=0
      method="POST"
      action="/server?request=send"
      enctype="multipart/form-data"
      id="uploadform"
      name="uploadform"
      onsubmit="return checkUpload()">
  <H2>Upload</H2>
  <p>Server directory:<br>
  <input type="text"
         id="directory"
         name="directory"
         value="./"
         size="30"></p>
  <p>Local file to be uploaded:<br>
  <input type="file"
         id="file"
         name="file"
         size="40"></p>
  <p><input type="submit" value="Send"></p>
</form>

O envio manual usando sua interface da web funciona bem. Estou tentando escrever uma ferramenta rápida que envie o formulário para nós usando curl . Eu tentei muitas tentativas diferentes, mas até agora, cada uma, embora eu receba uma resposta HTML "Arquivo carregado com sucesso", o arquivo que elas recebem está vazio.

Originalmente, começamos a tentar usar o curl porque foi assim que a empresa de clearinghouse sugeriu que o fizéssemos. O exemplo que eles deram foi isto:

curl -i -k -H "Content-Type:application/octet-stream" \
  -d @test.txt -u username:password \
  https://example.com/server?request=send?filename=test.txt?directory=DX001

Quando isso não funcionou, comecei a olhar para o código no formulário acima e tentei o seguinte (enquanto no mesmo diretório que o arquivo XML):

curl -F "request=send" -F "directory=DX001" -F "file=33823.xml" \
  -u username:password -F "enctype=\"multipart/form-data\"" \
  -F "id=\"uploadform\"" https://example.com/server

Quando isso não funcionou, pensei em testar o caminho absoluto, mesmo estando no mesmo diretório:

curl -F "request=send" -F "directory=DX001" -F "file=/Users/chuck/Desktop/33823.xml" \
  -u username:password -F "enctype=\"multipart/form-data\"" \
  -F "id=\"uploadform\"" https://example.com/server

Cada um deles só envia um arquivo vazio (com o nome do arquivo fornecido).

Como você provavelmente sabe do caminho completo, estou fazendo isso com o macOS, caso isso seja relevante.

Observe que a ação onsubmit no formulário simplesmente garante que nem as entradas directory nem file estejam vazias.

    
por Chuck 10.07.2018 / 23:02

1 resposta

2

Every single one of these only uploads an empty file (with the given file's name).

Curl não sabe quais campos são textos regulares e quais são uploads de arquivos; assume o primeiro, a menos que você diga especificamente para fazer o último. Para anexar um arquivo inteiro, você precisa do prefixo @ :

-F "file=@/Users/chuck/Desktop/33823.xml"

Você pode dar ao servidor um nome de arquivo diferente como este:

-F "file=@\"/Users/chuck/Desktop/temp.xml\";filename=\"33823.xml\""

O comando completo correto deve ser:

curl -u username:password \
     -F "directory=DX001" \
     -F "file=@/Users/chuck/Desktop/33823.xml" \
     https://example.com/server?request=send

Observe como request=send não é parte dos dados do formulário; era parte da URL antes, ela ainda faz parte da URL agora. Finalmente, embora todos os seus exemplos incluam -u para autenticação, lembre-se de que ele funciona apenas para o mecanismo HTTP 'Básico', não para páginas de login baseadas em formulários / cookies.

    
por 11.07.2018 / 07:15

Tags