2013-02-28 23 views
8

Tôi muốn tải lên tệp bằng cURL. Kể từ cURL đòi hỏi đường dẫn đầy đủ đến tập tin vì vậy đây là mã của tôi:Thay đổi tên của tệp tải lên trong cURL?

curl_setopt($ch, CURLOPT_POSTFIELDS, array("submit" => "submit", "file" => "@path/to/file.ext")); 
curl_exec($ch); 

Tuy nhiên cURL cũng sẽ gửi con đường này đầy đủ của tập tin trong tiêu đề yêu cầu:

Content-Disposition: form-data ; name = "tệp"; filename = "/ path/to/file.ext"

Nhưng tôi muốn nó được chỉ

Content-Disposition: form-data; name = "tệp"; filename = "file.ext"

Vì vậy, tôi thay đổi mã để

curl_setopt($ch, CURLOPT_POSTFIELDS, array("submit" => "submit", "file" => "@file.ext")); 
chdir("path/to"); # change current working directory to where the file is placed 
curl_exec($ch); 
chdir("path"); # change current working directory back 

Và sau đó cURL chỉ đơn giản là ném một thông báo lỗi

không thể mở tập tin "file.ext"

Ai đó có thể cho tôi biết cách làm điều đó không?

Trả lời

16

phương pháp mới (kể từ PHP 5.5) sử dụng CURLFile:

$file = new CURLFile('path/to/file.ext'); 
$file->setPostFilename('file.ext'); 

sử dụng nó gần như giống nhau:

012.
"file" => $file 

Old phương pháp:

Thay vì

"file" => "@path/to/file.ext" 

bạn có thể nói cURL để sử dụng một filename:

"file" => "@path/to/file.ext; filename=file.ext" 

Bằng cách đó nó sẽ sử dụng path/to/file.ext như nguồn tập tin, nhưng file.ext làm tên tệp.

Mặc dù vậy, bạn sẽ cần một đường dẫn rất tuyệt đối, vì vậy có thể bạn đang thiếu một số /: /path/to/file.ext hàng đầu.Vì bạn đang sử dụng PHP, luôn thực hiện một số realpath():

Hoặc tương tự như vậy.

+0

Phiên bản PHP nào được yêu cầu cho điều này? – Jeroen

+0

Bất kỳ. Phiên bản của cURL có thể quan trọng, nhưng có lẽ là không. Bạn đã thử à? Thử nó. – Rudie

+0

Có, tôi đã làm việc đó ngay bây giờ. Cảm ơn! +1 – Jeroen

0

Bạn cần phải đặt tệp trong một khu vực tạm thời và sau đó tham chiếu tệp từ đó nếu bạn muốn ẩn vị trí tệp thực. Thật không may, cURL không hỗ trợ việc gửi dữ liệu nhị phân hoặc bạn chỉ có thể gửi chuỗi dữ liệu base64 hoặc nhị phân thay vì tham chiếu tên tệp.

8

Vui lòng sửa tôi nếu tôi sai nhưng việc tải lên cURL sẽ không hoạt động với đường dẫn tương đối. Nó luôn luôn cần một đường dẫn tuyệt đối, thích

$realpath = realpath($uploadfile); 

Vì vậy, nếu ai đó muốn che giấu vị trí để tập tài liệu lưu trên máy chủ web của mình khi tải lên, hoặc di chuyển nó vào một thư mục tạm thời hoặc sử dụng fsockopen() (xem example này trong PHP Hướng dẫn người dùng đóng góp Ghi chú)

+0

cảm ơn đã giải quyết được vấn đề của tôi trong ngày :) – wayzz