2012-08-11 11 views
5

Mam tu mały problem, w jaki sposób mogę powiedzieć cURL, że chce załączyć plik do żądania?Korzystanie z narzędzia cURL w celu przesłania pliku bez symbolu @?

Jeśli mam przesłać plik z cURL, wówczas powszechną metodą jest dołączenie go jako część tablicy danych POST z wartością mającą @ przed nim, na przykład:

CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt') 

Ten sposób oczywisty działa, ale mam z tym dwa problemy:

  • Co jeśli to nie jest plik, który ładuję? Co się stanie, jeśli moja wartość POST rzeczywiście jest "@ my-file.txt" i spróbuje w zamian załadować plik? Tworzy lukę, której desperacko próbuję uniknąć.
  • Jak mogę przesłać plik z adresu URL? Czy muszę go pobrać, zapisać w folderze tymczasowym, a następnie dołączyć do @ z tego folderu tymczasowego? Dlaczego nie mogę podać cURL tylko treści, które chcę użyć jako pliku?

cURL CURLOPT_INFILE nie jest opcją, ponieważ nie pojawi się jako część tablicy $ _FILES.

Wygląda na to, że taka luka w cURL zależy od znaku @ w wartości pola POST. Czy jest jakiś sposób obejścia tego? Dlaczego nie ma tablicy CURLOPT_FILEFIELDS? Wiersz polecenia cURL ma osobną flagę dla tego (-F), ale nie widzę tego jako opcji w PHP z jakiegoś powodu.

Każda pomoc będzie bardzo ceniona, dzięki!

+1

Re lufą, wydaje się, że to nie jest możliwe: https://bugs.php.net/bug.php?id=46439 będziesz musiał ręcznie sprawdzić obecność '@' podczas sprawdzania wartości wejściowych. –

+0

Może ['http_build_query'] (http://php.net/http_build_query), jak w [tej odpowiedzi] (http://stackoverflow.com/a/648296/773625)? – mAu

+0

Dzięki Pekka, szkoda tylko, że nie było rozwiązania. Ale mAu: To nie działa, ponieważ mój interfejs API również musiałby obsługiwać przesyłanie plików. Wszystko byłoby dobrze, gdyby można było przesyłać pliki oddzielnie od pól POST i muszę również przesłać pewne dane w POST (ponieważ istnieją granice GET, których nie ma w POST). – kingmaple

Odpowiedz

1

W rezultacie udało mi się wykryć, czy którekolwiek z danych wejściowych rozpoczęło się od symbolu @, a jeśli tak, to przesłać je jako zmienną GET (jako część adresu URL przesłania w cURL). Nie pomaga we wszystkich przypadkach (na przykład gdy duży ciąg jest wysyłany zaczynający się od @), ale eliminuje problemy, które miałem z uchwytami na Twitterze.

Powiązane problemy