2015-07-30 11 views
8

Tôi nhận được hành vi lạ này với libCURL. Khi tôi cố gắng tải lên tệp bằng cách gắn "@" vào đầu tên tệp (như được ghi trong trang người dùng của libCURL), thay vì nội dung tệp đang được tải lên, libCURL sẽ tự gửi tên tệp (với @ ở đầu).LibCURL gửi tên tệp chứ không phải nội dung tệp khi tôi cố tải lên tệp nhị phân trong Windows Server 2008

Điều này đang chạy trên Windows 2008 R2, với phiên bản xampp 5.6.8, có curl được biên dịch trong (phiên bản curl 7.40.0).

Dưới đây là releant đoạn mã:

$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); 

Mã này hoạt động trên Linux, nhưng không phải là Windows Server 2008.

Đây là dữ liệu mẫu mà tôi nhận được:

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

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

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

Như bạn có thể nhìn thấy Tôi nhận được @C:\image.png thay vì nội dung.

Có ai biết tại sao libCURL không tải lên nội dung tệp không?

Trả lời

5

Từ các tài liệu của curl-setopt

CURLOPT_POSTFIELDS Các dữ liệu đầy đủ để viết trong một HTTP "POST" hoạt động. Để đăng tệp, hãy thêm tên tệp bằng @ và sử dụng đường dẫn đầy đủ. Loại tệp có thể được chỉ định rõ ràng bằng cách làm theo tên tệp với loại ở định dạng '; type = mimetype'. Tham số này có thể là được truyền dưới dạng chuỗi được mã hóa url như 'para1 = val1 & para2 = val2 & ...' hoặc là một mảng có tên trường là dữ liệu khóa và trường làm giá trị. Nếu giá trị là một mảng, tiêu đề Loại nội dung sẽ được đặt thành multipart/form-data. Kể từ PHP 5.2.0, giá trị phải là một mảng nếu các tệp được chuyển đến tùy chọn này với tiền tố @. Kể từ PHP 5.5.0, tiền tố @ không được chấp nhận và các tệp có thể được gửi bằng CURLFile. Tiền tố @ có thể bị tắt để chuyển các giá trị an toàn bắt đầu bằng @ by đặt tùy chọn CURLOPT_SAFE_UPLOAD thành TRUE.

Hành vi phụ thuộc vào bản phát hành php và tiền tố @ hiện không còn được dùng nữa.

Bạn nên sử dụng CurlFile class để thiết lập CURLOPT_POSTFIELDS được yêu cầu curl như thế này:

$post['pic'] = new CurlFile('C:\\image.png'); 
$ret = curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
Các vấn đề liên quan