2015-04-30 20 views
13

Próbuję wysłać żądanie cURL za pomocą wiersza polecenia. Poniżej jest moja prośbaNie można wysłać pliku jako danych formularza przy użyciu cURL

curl -i http://localhost/test/index.php 
-X POST 
-F "name=file.png" 
-F "[email protected]/var/www/html/test/file.png" 

Problem mam jest to, że plik nie jest uzyskiwanie wysyłane z żądaniem. Nazwa jest wysyłana dobrze, ale nie plik. Czy ktoś może zobaczyć, czy robię coś, co jest oczywiście błędne?

mam sprawdzić uprawnienia do pliku, jak myślałem, że może być problem, ale są w porządku

Backend jest napisane przy użyciu ramy PHP Slim i robię następujące $app->request->post('content');

+0

Spróbuj ustawić typ zawartości '... file.png; type = application/octet-stream' lub' image/png'. Może to problem z backendem. Co sprawia, że ​​mówisz, że nie jest wysyłany? –

+0

Twoje polecenie działa dobrze. Jak próbujesz odczytać plik z backendu? – Phillip

+0

@Phillip Zaktualizowałem swoją odpowiedź, podając więcej szczegółów.Więc kiedy próbuję uzyskać zmienną POST "content", zawsze jest pusta – Bender

Odpowiedz

9

Jeśli chcesz mieć dostęp do zawartości pliku za pomocą $app->request->post('content'); Twój curl prośba musi używać < zamiast @ na polu content,

curl -i http://localhost/test/index.php -X POST -F "name=file.png" \ 
    -F "content=</var/www/html/test/file.png" 

Od manpage Curl za:

Aby wymusić „content” część być plik, wpisz nazwę pliku ze znakiem @. Aby pobrać część zawartości z pliku, należy poprzedzić nazwę pliku symbolem <. Różnica między @ i < polega na tym, że @ powoduje, że plik zostaje dołączony do posta jako plik do przesłania, , podczas gdy < tworzy pole tekstowe i po prostu pobiera zawartość tego pola tekstowego z pliku.

Za pomocą @, oznaczone pole jako plik. Technicznie, to dodaje nagłówek Content-Disposition do pola (RFC 2388, jeśli jesteś zainteresowany). PHP wykrywa to i automatycznie przechowuje pole wewnątrz $_FILES zamiast $_POST, jak zauważył Raphaël Malié w komentarzu, dlatego nie można uzyskać dostępu do zawartości za pomocą $app->request->post.

Należy rozważyć przestawienie się na używanie $_FILES w backendie, jeśli jednak chcesz wesprzeć przesyłanie przy użyciu elementów i formularzy przeglądarki w postaci "<input type=file>". Te zawsze ustawiają nagłówek Content-Disposition.

+0

Dzięki za odpowiedź, spróbuję. Którą metodę poleciłbyś? Zmiana z @ na Bender

+0

Jeśli nie masz pewności, przełącz się na '$ _FILES'. ([Dokumentacja jest na wszelki wypadek] (http://php.net/manual/en/features.file-upload).) Standardowo obsługuje przesyłanie w ten sposób i chociaż mogę wymyślić sytuacje, w których chcą tego uniknąć, wszystkie są raczej ezoteryczne. – Phillip

0

Istnieje wersja 01.w wersji php 5.2.6 i niższej. Zweryfikuj wersję php i przetestuj najnowszą wersję. To może być problem.

+0

Pytanie dotyczy użycia cURL z wiersza poleceń, a nie z PHP. – Phillip

0

@Bender, używać symbolu @ jednak wprowadzić zmiany w kodzie PHP, takie, które wykorzystują $ _FILES zmiennej. To pomoże. Upewnij się, że podałeś pełną ścieżkę bezwzględną dla cURL. W przeciwnym razie dostaniesz błąd.

Proszę odnieść się ten sam rodzaj SO pytanie tutaj: File Upload to Slim Framework using curl in php

nadzieję, że to pomaga.