Strumento da riga di comando di Linux per il caricamento di file su HTTP come multipart / form-data?


22

Vedo che wget ha un'opzione --post-file, ma la manpage dice "Wget non supporta attualmente multipart / form-data per trasmettere i dati POST, solo application / x-www-form-urlencoded. -post-data 'e' --post-file 'dovrebbero essere specificati. "

Esiste un modo simile per caricare file in multipart / form-data?

Risposte:


29

Usa arricciatura:

curl -F "file=@localfile;filename=nameinpost" url.com

15

È possibile farlo solo con wget. Almeno con la versione 1.13.4 e forse altri. L'opzione --post-file ti consente di specificare un file da inviare, a patto che il file postdata sia costruito correttamente.

Ho anche provato questo con i file binari e funziona come previsto. NON è necessario codificare in base64 il file, ma è necessario assicurarsi che il file non contenga il limite.

Il comando minimo richiesto per fare questo lavoro sarebbe:

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

e il file postdata dovrebbe contenere qualcosa come:

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

Un certo numero di dettagli sono importanti qui:

  1. Le righe nel file di dati del post sono terminate con \ r \ n. L'unica eccezione sono i dati all'interno del contesto del file.
  2. Ogni attributo BOUNDARY nei dati post dovere corrisponde al valore BOUNDARY nella chiamata a wget. (FILEUPLOAD nell'esempio)
  3. Tutti i limiti sono preceduti da due trattini "-" e terminati con \ r \ n
  4. L'ultimo limite è suffisso con due trattini aggiuntivi "-" e terminato con \ r \ n
  5. Ogni parte di dati, contenuto di file o valore di parametro, è circondata da una riga vuota "\ r \ n"

Ho pensato che questo potesse aiutare qualcuno dal momento che alcuni ambienti controllati hanno wget ma non si arricciano.


Non ho potuto ottenere wget per lavorare con un file binario. Ho creato la porzione di testo del file di dati del post, salvata, utilizzata cat pic.jpg >> postdata, caricato in Notepad ++ e aggiunto l'ultimo limite + '-' + EOL. Riferimento W3C
Chloe

@Chloe, ho dovuto rivisitare questo per un altro progetto, e questa volta i file binari erano necessari e ho trovato che funzionava come previsto. Ho costruito una semplice pagina di caricamento del file php e poi l'ho fatto attraverso un browser per ottenere prima le dimensioni del file e poi confrontato con il risultato usando wget. Ti suggerirei di fare lo stesso poiché una newline randagio può far fallire l'intero processo.
tudor

1
Manca un punto e virgola. Ha causato problemi con python tornado --header = "Content-type: multipart / form-data; boundary = FILEUPLOAD"
FlappySocks
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.