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

1306
Chuck

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

0
Вероятно, лучше всего заглянуть в инструменты разработки, прежде чем вручную отправлять форму, как это предлагается в [этом ответе] (https://superuser.com/a/1254742/206587) davidmneedham 5 лет назад 1
Я полностью согласен с @davidmneedham. Отправьте хорошие поля заголовка HTTP. Кроме того, их веб-интерфейс использует, возможно, уникальный сеансовый cookie (токен). Jerry 5 лет назад 0

1 ответ на вопрос

2
grawity

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

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

-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. Наконец, хотя все ваши примеры включают в себя аутентификацию, помните, что он работает только для механизма HTTP «Basic», а не для страниц входа на основе форм / cookie.-u

Похожие вопросы