2011-01-31 30 views
5

Khi tôi sử dụng Linux và thử tải tệp lên máy chủ từ xa bằng cách sử dụng tập lệnh này thì tất cả đều tốt. Nhưng nếu tôi sử dụng Windows thì kịch bản không hoạt động. Tập lệnh:các tệp tải lên cURL lên máy chủ từ xa trên MS Windows

$url="http://site.com/upload.php"; 
$post=array('image'=>'@'.getcwd().'images/image.jpg'); 
$this->ch=curl_init(); 
curl_setopt($this->ch, CURLOPT_URL, $url); 
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->ch, CURLOPT_TIMEOUT, 30); 
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($this->ch, CURLOPT_POST, 1); 
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 
$body = curl_exec($this->ch); 
echo $body; // << on Windows empty result 

Tôi đang làm gì sai?

PHP 5.3

Windows 7 - không làm việc, Ubuntu Linux 10.10 - làm việc

+0

Bạn có cURL biên soạn để cài đặt PHP của bạn trên máy chủ windows của bạn? Hiển thị thông báo lỗi được cung cấp. Bạn có thể kiểm tra cài đặt thông qua tập lệnh [phpinfo()] (http://php.net/manual/en/function.phpinfo.php). – Orbling

+0

Lỗi không được hiển thị. (error_reporting = on) – Dador

+0

getcwd() không trở lại với dấu gạch chéo ở cuối, vì vậy tôi thiếu một cái, bên cạnh đó bạn không nên sử dụng dấu gạch chéo ngược trên cửa sổ thay vì một forwardslash? –

Trả lời

4

Nếu bạn đang sử dụng Windows, đường dẫn tập tin phân cách của bạn sẽ được \ không phải là Linux phong cách /.

Một điều hiển nhiên phải cố gắng là

$post=array('image'=>'@'.getcwd().'images\image.jpg'); 

Và xem nếu mà làm việc.

Nếu bạn muốn chắc kịch bản của bạn xách tay vì vậy nó sẽ làm việc trên với Windows hoặc Linux, bạn có thể sử dụng PHP's predefined constantDIRECTORY_SEPARATOR

$post=array('image'=>'@'.getcwd().'images' . DIRECTORY_SEPARATOR .'image.jpg'); 
+0

Câu trả lời hay. nhận được một số điều mới. –

4

Về mặt lý thuyết, mã của bạn không nên làm việc (i có nghĩa là tải lên) trong bất kỳ, unix hoặc cửa sổ. Hãy xem xét phần này từ mã của bạn:

'image'=>'@'.getcwd().'images/image.jpg' 

Trong cửa sổ getcwd() trả F:\Work\temp
Trong Linux Nó trả /root/work/temp

Vì vậy, mã trên của bạn sẽ biên dịch như dưới đây:

Windows: 'image'=>'@F:\Work\tempimages/image.jpg'
Linux : 'image'=>'@/root/work/tempimages/image.jpg'

Vì bạn đã đề cập nó đã làm việc cho bạn trong linux, có nghĩa là /root/work/tempimages/image.jpg bằng cách nào đó tồn tại trong hệ thống tập tin của bạn.

My PHP phiên bản:
Linux: PHP 5.1.6
Windows: PHP 5.3.2

+1

Có điều này là có thể quan sát được. câu trả lời hay. –

1

Bạn nên cố gắng var_dump($body) để xem những gì $body thực sự chứa. Với cách bạn định cấu hình cURL, $body sẽ chứa phản hồi của máy chủ hoặc sai, do lỗi. Không có cách nào để phân biệt giữa một phản hồi trống hoặc sai với echo. Có thể yêu cầu đang diễn ra tốt và máy chủ chỉ không trả lại gì cả.

Tuy nhiên, như những người khác đã nói, đường dẫn tệp của bạn có vẻ không hợp lệ. getcwd() không xuất kết quả cuối cùng là / và bạn sẽ cần thêm một mã để làm cho mã hoạt động. Kể từ khi bạn nói nó hoạt động trên Linux, ngay cả khi không có dấu gạch chéo còn thiếu, tôi tự hỏi làm thế nào nó là tìm tập tin của bạn.

Tôi khuyên bạn nên tạo đường dẫn đến tệp liên quan đến tập lệnh PHP đang chạy hoặc cung cấp đường dẫn tuyệt đối và không dựa vào getcwd() có thể không trả về những gì bạn mong đợi.Giá trị của getcwd() có thể không thể đoán trước trên các hệ thống và không phải là rất di động.

Ví dụ, nếu tập tin bạn đang cố gắng POST nằm trong cùng một thư mục như kịch bản PHP của bạn:

$post = array('image' => '@image.jpg'); là đủ. Nếu cần thiết, cung cấp một đường dẫn tuyệt đối: $post = array('image' => '@/home/youruser/yourdomain/image.jpg');

Như Terence nói, nếu bạn cần mã của bạn để được cầm tay trên Linux & Windows, xem xét sử dụng PHP's Predefined ConstantDIRECTORY_SEPARATOR

$url = "http://yoursite.com/upload.php"; 
// images\image.jpg on Windows images/image.jpg on Linux 
$post = array('image' => '@images'.DIRECTORY_SEPARATOR.'image.jpg'); 
$this->ch = curl_init(); 
curl_setopt($this->ch, CURLOPT_URL, $url); 
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->ch, CURLOPT_TIMEOUT, 30); 
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($this->ch, CURLOPT_POST, 1); 
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 
$body = curl_exec($this->ch); 
var_dump($body); 

getcwd()cURL

1

nếu làm việc với xampp Đảm bảo rằng trong tệp cấu hình php.ini

Số dòng 952 là không chú thích tức nếu dòng là

;extension=php_curl.dll 

sau đó làm cho nó

extension=php_curl.dll 
+0

Curl đang hoạt động nhưng đã xảy ra lỗi khác. –

1

Tôi nghĩ, một cách tiếp cận tốt hơn sẽ là:

$imgpath = implode(DIRECTORY_SEPARATOR, array(getcwd(), 'images', 'image.jpg')); 
$post = array('image'=>'@'.$imgpath); 
Các vấn đề liên quan