2015-07-30 26 views
8

Otrzymuję dziwne zachowanie z libCURL. Kiedy próbuję przesłać plik, dołączając "@" do początku nazwy pliku (zgodnie z dokumentacją na stronie podręcznika biblioteki libCURL), zamiast przesyłania plików, libCURL wysyła samą nazwę pliku (z znakiem @ na początku).LibCURL wysyła nazwę pliku zamiast zawartości pliku, gdy próbuję załadować plik binarny w systemie Windows Server 2008

Działa w systemie Windows 2008 R2, z wersją x86 w wersji x86, która ma skompilowane curl (wersja 7.40.0).

Oto kod releant fragment:

$post['pic'] = "@C:\\image.png"; 

$ret = curl_setopt($ch, CURLOPT_POST, TRUE); 
if (!$ret) die("curl_setopt CURLOPT_POST failed"); 
$ret = curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
if (!$ret) die("curl_setopt CURLOPT_POSTFIELDS failed"); 

$response = curl_exec($ch); 

Ten kod działa na Linux, ale nie Windows Server 2008.

Oto dane formularz, który pojawia się:

Content-Type: multipart/form-data; \\ 
boundary=------------------------c74a6af8b52d997a 

--------------------------c74a6af8b52d997a 
Content-Disposition: form-data; name="pic" 

@C:\image.png 
--------------------------c74a6af8b52d997a-- 

Jak widać Otrzymuję @C:\image.png zamiast zawartości.

Czy ktoś wie, dlaczego libCURL nie załadowałby zawartości pliku?

Odpowiedz

5

Z dokumentacji curl-setopt

CURLOPT_POSTFIELDS pełne dane odpowiedzieć w HTTP "POST" operacja. Aby opublikować plik, dodaj nazwę pliku za pomocą @ i użyj pełnej ścieżki. Typ pliku można jawnie określić, podążając za nazwą pliku z typem w formacie "; type = mimetype". Ten parametr może być albo przekazywany jako łańcuch w kształcie litery urn, taki jak "para1 = val1 & ..." lub jako tablica z nazwą pola jako kluczem i danymi pola jako wartością. Jeśli wartość jest tablicą, nagłówek Content-Type zostanie ustawiony na multipart/form-data. Od wersji PHP 5.2.0 wartość musi być tablicą, jeśli pliki są przekazywane do tej opcji z przedrostkiem @. Od PHP 5.5.0 prefiks @ jest przestarzały, a pliki mogą być wysyłane za pomocą CURLFile. Prefiks @ można wyłączyć w celu bezpiecznego przekazywania wartości rozpoczynających się od @ przez ustawiając opcję CURLOPT_SAFE_UPLOAD na PRAWDA.

Zachowanie zależy od wydania php, a prefiks @ jest już uznany za przestarzały.

Należy użyć CurlFile class ustawić CURLOPT_POSTFIELDS z curl wniosku jak ten:

$post['pic'] = new CurlFile('C:\\image.png'); 
$ret = curl_setopt($ch, CURLOPT_POSTFIELDS, $post);