- cURL http post file upload using curl —data in linux command line
- 1 Answer 1
- Linux command line tool for uploading files over HTTP as multipart/form-data?
- Post request with Wget?
- 1 Answer 1
- Как закачать файл (архив) на сервер Linux с помощью команды wget
- Синтаксис и опции wget
- Загрузка файла на сервер linux командой wget
- Как загрузить файл на сервер linux с другим именем с помощью утилиты wget с опцией -O
- Указание пути сохранения скачиваемого утилитой wget файла с помощью опции -P
- Резюме
- Пример использования в видео-инструкции:
cURL http post file upload using curl —data in linux command line
but it is not uploading the file to the server, even though it is sending the response back. Although if I use this command it will upload the file and send the response back:
curl -v -F 'filename=registration.png' -F 'file=@/var/www/fbapp/images/registration.png' http://myserver/xmltest/curlupload.php
But I wanted the command in the curl —data format itself. This is my PHP code in the server:
> POST /xmltest/curlupload.php HTTP/1.1 > User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: myserver > Accept: */* > Content-Length: 44 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 44out of 44 bytes < HTTP/1.1 200 OK < Date: Thu, 06 Nov 2014 07:01:56 GMT < Server: Apache < Vary: Accept-Encoding < Transfer-Encoding: chunked < Content-Type: text/html < * Connection #0 to host myserver left intact * Closing connection #0 filedata= success
1 Answer 1
You usually can't simply pick -F or -d (--data) at your choice. The web server that will receive your post expects one of the formats. If the form you're trying to submit uses the type 'multipart/form-data', then and only then you must use the -F type. If not, you should use -d which then causes a posting with the type 'application/x-www-form-urlencoded'.
multipart/formposts with -F uses a special formatting of the post with Mime-headers separating the different parts and each part having its own set of headers.
-d is just raw data being sent for the server to interpret/decode.
(But since you write the PHP code in this case, you just have to decide which POST method you want to accept and then make your curl command line use that.)
Linux command line tool for uploading files over HTTP as multipart/form-data?
It is possible to do this with wget only. At least with version 1.13.4 and maybe others. The --post-file option allows you to specify a file to send, so long as the postdata file is constructed properly.
I have also tested this with binary files and it works as expected. You do NOT need to base64 encode the file, but you do need to ensure your file does not contain the boundary.
The minimum command required to make this work would be:
wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform
and the postdata file would need to contain something like:
--FILEUPLOAD Content-Disposition: form-data; name="comment" I love uploading files! --FILEUPLOAD Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin"; Content-Type: application/octet-stream Media Type: application/octet-stream Give me some automated file upload action! --FILEUPLOAD--
A number of details are important here:
- Lines in the post data file are terminated with \r\n. The only exception is data inside the file context.
- Every BOUNDARY attribute in the postdata must match the BOUNDARY value in the call to wget. (FILEUPLOAD in the example)
- All boundaries are prefixed with two hyphens "--" and terminated with \r\n
- The last boundary is suffixed with two extra hyphens "--" and terminated with \r\n
- Each piece of data, file content or parameter value, is surrounded by an empty line "\r\n"
I thought this might help someone since some controlled environments have wget but not curl.
Post request with Wget?
I want to use wget to upload a picture to a distant server, using an authentication token, 'AUTH_1624582364932749DFHDD', to the 'test' folder. This command doesn't work (authorization failed), and I want to make sure that it's not about syntax:
wget --post-file=nature.jpg http://ipadress:8080/v1/AUTH_test/test/ --post-data="AUTH_1624582364932749DFHDD"
1 Answer 1
Wget currently doesn't not support "multipart/form-data" data. --post-file is not for transmitting files as form attachments, it expects data with the form: key=value&otherkey=example . It is actually possible to post other formats (json) if you send the corresponding header.
--post-data and --post-file work the same way: the only difference is that --post-data allows you to specify the data in the command line, while --post-file allows you to specify the path of the file that contain the data to send.
--post-data=string --post-file=file Use POST as the method for all HTTP requests and send the specified data in the request body. --post-data sends string as data, whereas --post-file sends the contents of file. Other than that, they work in exactly the same way. In particular, they both expect content of the form "key1=value1&key2=value2", with percent-encoding for special characters; the only difference is that one expects its content as a command-line parameter and the other accepts its content from a file. In particular, --post-file is not for transmitting files as form attachments: those must appear as "key=value" data (with appropriate percent-coding) just like everything else. Wget does not currently support "multipart/form-data" for transmitting POST data; only "application/x-www-form-urlencoded". Only one of --post-data and --post-file should be specified.
Regarding your authentication token, it should either be provided in the header, in the path of the url, or in the data itself. This must be indicated somewhere in the documentation of the service you use. In a POST request, as in a GET request, you must specify the data using keys and values. This way the server will be able to receive multiple information with specific names. It's similar with variables.
Hence, you can't just send a magic token to the server, you also need to specify the name of the key. If the key is "token", then it should be token=YOUR_TOKEN .
wget --post-data 'user=foo&password=bar' http://example.com/auth.php
Also, you should consider using curl if you can because it is easier to send files using it. There are many examples on the Internet for that.
Как закачать файл (архив) на сервер Linux с помощью команды wget
Для того, чтобы закачать файл на удалённый сервер есть масса способов. Пожалуй, самый безумный, который можно придумать, это вбить его ручками с клавиатуры, но это долго и мучительно. Самый распространённый способ — это залить файл на сервер с помошью ftp-клиента на удалённом компьютере. В этой статье рассмотрим утилиту wget , которая позволяет скачивать файлы (и даже целые сайты) к себе на удалённый сервер. wget чаще всего используется для закачки дистрибутивов или ключей из репозиториев на сервер с оперционкой семейства *nix.
Синтаксис и опции wget
Для детального ознакомления с утилитой wget нужно потратить массу времени. Поэтому проще всего вызвать помощь по ней непосредственно в консоли сервера и начать именно с этого:
Если этого окажется мало, то можно почитать более подробный мануал:
Но для того, чтобы закачать дистрибутив на сервер потребуется всего лишь малая толика из этой лавины информации. Поэтому приведу лишь официальную информацию о синтаксисе вызова этой процедуры:
Загрузка файла на сервер linux командой wget
Рассмотрим самый простой случай. Есть дистрибутив Joomla, лежащий в официальном репозитории. Требуется его скачать для последующей установки.
- Заходим в нужную директорию у себя на сервере, куда нужно скачать этот дистрибутив
- Набираем команду: wget https://downloads.joomla.org/cms/joomla3/3-9-6/Joomla_3-9-6-Stable-Full_Package.zip
- Архив скачивается в ту папку, из которой произошёл вызов.
- Если файл по указанному адресу, то скачивание сопровождается подробной информацией (вплоть до статус-бара, показывающего в режиме реального времени того, сколько процентов скачено):
[email protected]:~# wget https://downloads.joomla.org/cms/joomla3/3-9-6/Joomla_3-9-6-Stable-Full_Package.zip --2019-05-17 23:46:28-- https://downloads.joomla.org/cms/joomla3/3-9-6/Joomla_3-9-6-Stable-Full_Package.zip Resolving downloads.joomla.org (downloads.joomla.org). 72.29.124.146 Connecting to downloads.joomla.org (downloads.joomla.org)|72.29.124.146|:443. connected. HTTP request sent, awaiting response. 303 See Other Location: https://s3-us-west-2.amazonaws.com/joomla-official-downloads/joomladownloads/joomla3/Joomla_3.9.6-Stable-Full_Package.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6S3Q3YQHG57ZRA%2F20190517%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20190517T204621Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=6a16c05547e770b6665bb7f5670f60acccc113712478c45fb05b23890b1cb958 [following] --2019-05-17 23:46:30-- https://s3-us-west-2.amazonaws.com/joomla-official-downloads/joomladownloads/joomla3/Joomla_3.9.6-Stable-Full_Package.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6S3Q3YQHG57ZRA%2F20190517%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20190517T204621Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=6a16c05547e770b6665bb7f5670f60acccc113712478c45fb05b23890b1cb958 Resolving s3-us-west-2.amazonaws.com (s3-us-west-2.amazonaws.com). 52.218.248.8 Connecting to s3-us-west-2.amazonaws.com (s3-us-west-2.amazonaws.com)|52.218.248.8|:443. connected. HTTP request sent, awaiting response. 200 OK Length: 13931139 (13M) [application/zip] Saving to: ‘Joomla_3-9-6-Stable-Full_Package.zip’ Joomla_3-9-6-Stable-Full_Package.zip 100%[====================================================================================>] 13.29M 4.06MB/s in 3.3s 2019-05-17 23:46:34 (4.06 MB/s) - ‘Joomla_3-9-6-Stable-Full_Package.zip’ saved [13931139/13931139]
Как загрузить файл на сервер linux с другим именем с помощью утилиты wget с опцией -O
Файлы, лежащие в удалённых хранилищах могут иметь названия, которые хочется поменять для того, чтобы они лежали у себя на сервере под другими именами. Можно конечно сперва скачать файл на сервер так, как показано в примере выше, а потом переименовать его, но wget позволяет сохранять загружаемые файлы и сразу присваивать им те имена, которые требуются, например:
wget -O joomla.zip https://downloads.joomla.org/cms/joomla3/3-9-6/Joomla_3-9-6-Stable-Full_Package.zip
- Где:
- wget – вызов утилиты wget
- -O — опция, которая служит указанием того, что скачиваемому файлу требуется задать другое имя
- joomla.zip — имя файла, под которым он будет сохранён после скачивания
- Joomla_3-9-6-Stable-Full_Package.zip — изначальное имя файла, которое было бы использовано, не примени мы опцию -O утилиты wget
Указание пути сохранения скачиваемого утилитой wget файла с помощью опции -P
Ну и последнее, что рассмотрим в этой статье, это то, как сохранить файл с помощью утилиты wget с удалённого места на сервер с указанием пути, по которому его нужно сохранить. Этого можно достичь, применив опцию -P в следующем формате:
wget -P ~/Downloads/ https://downloads.joomla.org/cms/joomla3/3-9-6/Joomla_3-9-6-Stable-Full_Package.zip
- Где
- -P – опция, которая служит для указания того, что будет указан путь, по которому должно произойти сохранение скачиваемого файла
- примечательным служит то, что если указанных папок на сервере на момент сохранения нет, то они будут созданы
Резюме
Таким образом утилитой wget можно скачать и сохранить файл в нужном месте на сервере с нужным именем. Остальные опции мне пока не нужны. =)
Пример использования в видео-инструкции:
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! 😉
- -P – опция, которая служит для указания того, что будет указан путь, по которому должно произойти сохранение скачиваемого файла