2013-09-01 95 views
0

我的一個客戶需要一個文件(圖片)通過捲髮(php-curl) 發送到plupload php腳本。問題是該文件似乎應該與塊一起發送。通過curl發送文件到plupload chunked

你能告訴我如何用PHP發送文件到這個腳本?

這裏是接受文件的上傳腳本文件。

<?php 
/** 
* upload.php 
* 
* Copyright 2009, Moxiecode Systems AB 
* Released under GPL License. 
* 
* License: http://www.plupload.com/license 
* Contributing: http://www.plupload.com/contributing 
*/ 

// HTTP headers for no cache etc 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 

// Settings 
$targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload"; 
//$targetDir = 'uploads'; 

$cleanupTargetDir = true; // Remove old files 
$maxFileAge = 5 * 3600; // Temp file age in seconds 

// 5 minutes execution time 
@set_time_limit(5 * 60); 

// Uncomment this one to fake upload time 
// usleep(5000); 

// Get parameters 
$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; 
$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0; 
$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : ''; 

// Clean the fileName for security reasons 
$fileName = preg_replace('/[^\w\._]+/', '_', $fileName); 

// Make sure the fileName is unique but only if chunking is disabled 
if ($chunks < 2 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) { 
    $ext = strrpos($fileName, '.'); 
    $fileName_a = substr($fileName, 0, $ext); 
    $fileName_b = substr($fileName, $ext); 

    $count = 1; 
    while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b)) 
     $count++; 

    $fileName = $fileName_a . '_' . $count . $fileName_b; 
} 

$filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName; 

// Create target dir 
if (!file_exists($targetDir)) 
    @mkdir($targetDir); 

// Remove old temp files  
if ($cleanupTargetDir) { 
    if (is_dir($targetDir) && ($dir = opendir($targetDir))) { 
     while (($file = readdir($dir)) !== false) { 
      $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file; 

      // Remove temp file if it is older than the max age and is not the current file 
      if (preg_match('/\.part$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge) && ($tmpfilePath != "{$filePath}.part")) { 
       @unlink($tmpfilePath); 
      } 
     } 
     closedir($dir); 
    } else { 
     die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}'); 
    } 
} 

// Look for the content type header 
if (isset($_SERVER["HTTP_CONTENT_TYPE"])) 
    $contentType = $_SERVER["HTTP_CONTENT_TYPE"]; 

if (isset($_SERVER["CONTENT_TYPE"])) 
    $contentType = $_SERVER["CONTENT_TYPE"]; 

// Handle non multipart uploads older WebKit versions didn't support multipart in HTML5 
if (strpos($contentType, "multipart") !== false) { 
    if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) { 
     // Open temp file 
     $out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab"); 
     if ($out) { 
      // Read binary input stream and append it to temp file 
      $in = @fopen($_FILES['file']['tmp_name'], "rb"); 

      if ($in) { 
       while ($buff = fread($in, 4096)) 
        fwrite($out, $buff); 
      } else 
       die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); 
      @fclose($in); 
      @fclose($out); 
      @unlink($_FILES['file']['tmp_name']); 
     } else 
      die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); 
    } else 
     die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); 
} else { 
    // Open temp file 
    $out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab"); 
    if ($out) { 
     // Read binary input stream and append it to temp file 
     $in = @fopen("php://input", "rb"); 

     if ($in) { 
      while ($buff = fread($in, 4096)) 
       fwrite($out, $buff); 
     } else 
      die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); 

     @fclose($in); 
     @fclose($out); 
    } else 
     die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); 
} 

// Check if file has been uploaded 
if (!$chunks || $chunk == $chunks - 1) { 
    // Strip the temp .part suffix off 
    rename("{$filePath}.part", $filePath); 
} 

die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}'); 
+0

「問題是,文件似乎應該被髮送與大塊。「 此聲明不明確。客戶需求是否能夠發送文件分塊?或者,你認爲php腳本期望文件被分塊嗎?分塊是可選的。你有沒有嘗試用php-curl發佈文件?你遇到什麼問題? – jbl

+0

親愛的@jbl也許問題是愚蠢的,但它似乎腳本期望它會被分塊,不是嗎?我不是很擅長php ...我會盡量將它作爲一個整體發佈... –

回答

1

我評論了PHP腳本的以下幾行,其中chunking似乎涉及到。當請求分塊參數不存在時,您會看到整個文件大小寫爲默認情況。

// $chunk is the index of the chunk being uploaded. 
// Considered as 0 if not present in the request (whole file, or fist chunk in chunking mode) 
$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0; 

// $chunks is the number of upload chunks. 
// Considered as 0 (whole file, no chunking) if not present in the request 
$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0; 

// if handling the first chunk (or whole file) open temp file in create mode, else in append mode 
$out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab"); 

// if not in chunking mode (!$chunks) or finished processing last chunk, rename the temp file to target nam 
if (!$chunks || $chunk == $chunks - 1) 

希望這將有助於

根據您的意見,當前頁面應該張貼的文件,用文件名defaultname.txt

<html> 
    <head> 
    <title>Upload Form</title> 
    </head> 
<body> 
<form enctype="multipart/form-data" action="/upload.php"; method="POST"> 
    <input type="text" name="name" size="20" value="defaultname.txt"/> <br /><br /> 
    <input type="file" name="file" size="20" /> <br /><br /> 
    <input type="submit" value="upload" /> 
</form> 
</body> 
</html> 
+0

我理解正確嗎?如果我完全用變量名稱「name」創建一個POST文件,它應該可以工作,對吧? (問題是我們沒有權限編輯upload.php腳本) –

+0

@ MR.GEWA「name」只是文件的名稱。文件內容也必須包含在內。見http://blog.derakkilgo.com/2009/06/07/send-a-file-via-post-with-curl-and-php/ – jbl

+0

當我發佈一個真實的文件,我得到{「jsonrpc」:「 2.0「,」error「:{」code「:103,」message「:」無法移動上傳的文件。「},」id「:」id「} –