Как загрузить файл с помощью` curl ' вместо формы?

у меня есть клиент, который использует клиринговую палату третьей стороны для получения счетов. Мы можем сделать это вручную, экспортировав наши данные в XML, Перейдя на определенный веб-сайт и загрузив файл. Соответствующая HTML форма выглядит так:

<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>

ручной подачей через веб-интерфейс работает нормально. Я пытаюсь написать быстрый инструмент, который отправляет форму для нас, используя curl. Я пробовал много разных попыток, но до сих пор каждый из них, хотя я получаю " файл успешно загружен" ответ HTML, файл они получают пуст.

мы изначально начали использовать curl потому что именно так предложила нам сделать информационно-координационная компания. Они привели следующий пример:

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

когда это не сработало, я начал смотреть на код в приведенной выше форме и попробовал следующее (в том же каталоге, что и 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

, когда это не сработало, я подумал, что попробую Абсолют путь хоть я и был в той же директории:

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

каждый из них загружает только пустой файл (с именем данного файла).

как вы, наверное, можете сказать из полного пути, я делаю это из macOS, Если это уместно.

внимание onsubmit действия в форме просто гарантирует, что ни directory, ни file входы пусты.

14
задан Chuck
09.03.2023 23:15 Количество просмотров материала 3486
Распечатать страницу

1 ответ

каждый из них загружает только пустой файл (с именем данного файла).

Curl не знаю какие поля являются обычным текстом, а какие-загрузкой файлов; он предполагает первое, если вы специально не скажете ему сделать последнее. Чтобы прикрепить целый файл, вам понадобится @ префикс:

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

вы можете дать серверу другое имя файла, например:

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

правильная полная команда должна be:

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

обратите внимание, как request=send is не часть данных формы; Раньше это была часть URL-адреса, теперь это все еще часть URL-адреса. Наконец, хотя все ваши примеры включают -u для аутентификации, помните, что он работает только для механизма HTTP "Basic",не для страниц входа на основе форм/файлов cookie.

2
отвечен grawity 2023-03-11 07:03

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх