У меня есть клиент, чей клиент использует стороннюю расчетную палату для получения счетов. Мы можем сделать это вручную, экспортировав наши данные в 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 не пусты.

1 ответ1

2

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

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

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

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

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

Правильная полная команда должна быть:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .