Chciałbym użyć cURL nie tylko do wysyłania parametrów danych w HTTP POST, ale także do przesyłania plików o określonej nazwie formularza. Jak mam to zrobić?
Parametry HTTP Post:
userid = 12345 filecomment = To jest plik obrazu
Przesyłanie pliku HTTP: Lokalizacja pliku = /home/user1/Desktop/test.jpg Nazwa formularza dla pliku = obraz (odpowiada $ _FILES ['obraz'] po stronie PHP)
Wymyśliłem część polecenia cURL w następujący sposób:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
Problem, który otrzymuję, jest następujący:
Notice: Undefined index: image in /var/www/uploader.php
Problem polega na tym, że używam $ _FILES ['image'] do pobierania plików w skrypcie PHP.
Jak odpowiednio dostosować polecenia CURL?
-d
omyłkowo odniosła się do opcji, która wymaga wejściowego zakodowanego adresu URL. Powinienem to usunąć, kiedy zaktualizowałem odpowiedź na-F
opcję. Dzięki za złapanie tego.@
wimage=@/..
środku?Łapanie identyfikatora użytkownika jako zmiennej ścieżki (zalecane):
Łapanie identyfikatora użytkownika jako części formularza:
lub:
źródło
"Content-Type: multipart/form-data"
Oto moje rozwiązanie, czytałem wiele postów i były one bardzo pomocne. W końcu napisałem trochę kodu dla małych plików, z CURL i PHP, które moim zdaniem są naprawdę przydatne.
Dzięki temu powinniśmy dostać się na „api.endpoint.post” zamieszczone następujące vars. Możesz łatwo przetestować za pomocą tego skryptu i powinieneś otrzymać ten debugowanie funkcji
postFile()
w ostatnim wierszu.Powinno działać dobrze, mogą to być lepsze rozwiązania, ale to działa i jest naprawdę pomocne, aby zrozumieć, jak mime Boundary i multipart / from-data działa na bibliotece PHP i cURL.
źródło
jeśli przesyłasz plik binarny, taki jak csv, użyj poniższego formatu, aby przesłać plik
źródło
--data-binary
nakazuje,curl
aby nie przeprowadzać wstępnego przetwarzania danych, w przeciwieństwie do--data
flagi. aby bezpośrednio odnieść się do komentarza, pamiętaj, że tekst jest również binarny, ale możemy interpretować go jako znaki ASCII. Jeśli naprawdę chcesz wyraźnego przykładu, pomyśl o pliku CSV, którego pola zawierają emoji. Ich bajty nie są bezpośrednio mapowane na tekstProblem, który mnie tu doprowadził, okazał się podstawowym błędem użytkownika - nie wpisałem
@
znaku do ścieżki pliku, więc curl publikował ścieżkę / nazwę pliku, a nie jego zawartość. WContent-Length
związku z tym wartość wynosiła 8 zamiast 479, której spodziewałem się zobaczyć, biorąc pod uwagę legnth mojego pliku testowego.Content-Length
Nagłówek zostanie automatycznie obliczana po curl odczytuje i posty plik.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Content-Length: 479 ...
Opublikowanie tego tutaj, aby pomóc innym początkującym.
źródło
Jako alternatywę
curl
możesz użyć HTTPie , it'a CLI, narzędzia podobnego do cURL dla ludzi.Instrukcje instalacji: https://github.com/jakubroztocil/httpie#installation
Następnie uruchomić:
źródło
Po wielu próbach to polecenie zadziałało dla mnie:
źródło
Oto, jak poprawnie uciec przed dowolnymi nazwami przesyłanych plików za pomocą
bash
:źródło
Mam to działa z tym poleceniem
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
źródło