Narzędzie wiersza polecenia systemu Linux do przesyłania plików przez HTTP jako dane wieloczęściowe / dane formularza?

25

Widzę, że wget ma --post-fileopcję, ale strona podręcznika mówi

Wget obecnie nie obsługuje danych wieloczęściowych / formularzy do przesyłania danych POST; tylko application / x-www-form-urlencoded. Tylko jedna --post-datai --post-filepowinna być określona.

Czy istnieje podobny sposób przesyłania plików w postaci danych wieloczęściowych / formularzy?

kdt
źródło

Odpowiedzi:

31

Użyj curl:

curl -F "file=@localfile;filename=nameinpost" url.com
Tobu
źródło
17

Można to zrobić tylko za pomocą wget. Przynajmniej z wersją 1.13.4 i może innymi. Opcja --post-file pozwala określić plik do wysłania, o ile plik postdata jest poprawnie skonstruowany.

Przetestowałem to również z plikami binarnymi i działa zgodnie z oczekiwaniami. NIE musisz kodować pliku base64, ale musisz upewnić się, że plik nie zawiera granicy.

Minimalne polecenie wymagane do wykonania tej pracy to:

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform

a plik postdata musiałby zawierać coś takiego:

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

Ważne są tutaj pewne szczegóły:

  1. Linie w pliku danych post są zakończone za pomocą \ r \ n. Jedynym wyjątkiem są dane w kontekście pliku.
  2. Każdy atrybut GRANICZNY w postdata musi być zgodny z wartością GRANICA w wywołaniu wget. (FILEUPLOAD w przykładzie)
  3. Wszystkie granice są poprzedzone dwoma łącznikami „-” i kończą się \ r \ n
  4. Ostatnia granica jest opatrzona dwoma dodatkowymi myślnikami „-” i kończy się na \ r \ n
  5. Każdy kawałek danych, zawartość pliku lub wartość parametru jest otoczony pustą linią „\ r \ n”

Pomyślałem, że to może komuś pomóc, ponieważ niektóre kontrolowane środowiska mają wget, ale się nie zwija.

tu-Reinstate Monica-dor duh
źródło
Nie mogłem zmusić wgeta do pracy z plikiem binarnym. Utworzyłem część tekstową pliku danych wpisu, zapisałem, wykorzystałem cat pic.jpg >> postdata, załadowałem w Notepad ++ i dołączyłem ostatnią granicę + '-' + EOL. Dokumentacja W3C
Chloe,
@Chloe, musiałem ponownie to sprawdzić w innym projekcie, tym razem potrzebne były pliki binarne i okazało się, że działa zgodnie z oczekiwaniami. Zbudowałem prostą stronę do przesyłania plików php, a następnie zrobiłem to przez przeglądarkę, aby najpierw uzyskać rozmiar pliku, a następnie porównać go z wynikiem użycia wget. Sugeruję, abyś zrobił to samo, ponieważ zbłąkany nowy wiersz może spowodować niepowodzenie całego procesu.
Tu-Reinstate Monica-dor duh
1
Brakuje średnika. Powodowało to problemy z python tornado --header = "Content-type: multipart / form-data; boundary = FILEUPLOAD"
FlappySocks