2014-11-04 104 views
0

我试图使用plupload直接将文件上传到我的Amazon S3存储桶。Plupload:直接将文件上传到亚马逊S3

我不知道究竟如何我的Amazon S3的PHP代码适应我当前的PHP plupload代码..

这是我的亚马逊S3的PHP代码:

include('s3_config.php'); 
$tmp = $_FILES['file']['tmp_name']; 
$file_name = test_file; 
if($s3->putObjectFile($tmp, $bucket , $file_name, S3::ACL_PUBLIC_READ)) 
{ 
$msg = "S3 Upload Successful."; 
} 

该电流PHP Plupload代码:

<?php 
if(isset($_REQUEST["name"])){ 

// 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 = "HST_USR_UPLOADED_FILES__DIR/hst_uploaded_files"; 

//$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 && 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"}'); 



// Handle non multipart uploads older WebKit versions didn't support multipart in HTML5 
    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"}'); 

// Check if file has been uploaded 
if (!$chunks || $chunk == $chunks - 1) { 

    // Strip the temp .part suffix off 
    rename("{$filePath}.part", $filePath);  


    ///--------------- 
     $filename = $fileName; 
     $ext = substr($filename,strrpos($filename, ".")); 

     if(preg_match('/\.(php|pl|py|cgi|asp|js)/i', $ext) && $ext != '.txt') 
     { 
      $ext = ".txt"; 
      $filename = $fileName.".txt"; 
     } 


     $newFileName = substr(md5(strtotime('now').uniqid()), 0, rand(7,12)).strtotime('now'); 
     $newFileName = urlencode($newFileName).$ext; 
     $filesize = filesize($filePath); 
     ////--------------- 


     rename($filePath, $targetDir . DIRECTORY_SEPARATOR . $newFileName); 

    $code = substr(md5("f_".strtotime('now').uniqid()), 0, rand(5,12)); 
    while(mysql_num_rows(mysql_query("SELECT id FROM files WHERE `code` = '$code'"))) 
    { 
     $code = substr(md5("f_".strtotime('now').uniqid()), 0, rand(5,12)); 
    } 



    //insert file record into database 
    if(mysql_query("INSERT INTO files VALUES (NULL, '$uid', '$filename', '$newFileName', '$code', '$filesize', 0, 0, NOW(), NULL, 0, NULL, 'local', NULL, NULL, 0, NULL)")) 
    { 
     die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}'); 
    }else 
    die('{"jsonrpc" : "2.0", "error" : {"code": 420, "message": "File upload failed."}, "id" : "id"}'); 


} 
?> 
+0

http://www.plupload.com/docs/Upload-to-Amazon-S3 – ceejayoz 2014-11-04 13:44:23

+0

我看到了,但实际上我不知道如何做到这一点..我之前解决了这个问题,但我是白痴,我删除了变化:facepalm:现在我不知道如何重新做到这一点 – Roberto 2014-11-04 13:46:38

回答

0

此代码有效。

<?php 

$fileName = $_FILES['file']['name']; 
$fileTempName = $_FILES['file']['tmp_name']; 

include('s3_config.php'); 

if($s3->putObjectFile($fileTempName, $bucket , $fileName, S3::ACL_PUBLIC_READ)) 
{ 
} 

?> 

最终代码:

<?php 
if(isset($_REQUEST["name"])){ 

// 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"); 

$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 
$fileName = $_FILES['file']['name']; 
$fileTempName = $_FILES['file']['tmp_name']; 
$filesize = $_FILES['file']['size']; 
include('s3_config.php'); 
if($s3->putObjectFile($fileTempName, $bucket , $fileName, S3::ACL_PUBLIC_READ)) 
{ 
    $code = substr(md5("f_".strtotime('now').uniqid()), 0, rand(5,12)); 
    while(mysql_num_rows(mysql_query("SELECT id FROM files WHERE `code` = '$code'"))) 
    { 
     $code = substr(md5("f_".strtotime('now').uniqid()), 0, rand(5,12)); 
    } 



    //insert file record into database 
    if(mysql_query("INSERT INTO files VALUES (NULL, '$uid', '$fileName', '$fileName', '$code', '$filesize', 0, 0, NOW(), NULL, 0, NULL, 'local', NULL, NULL, 0, NULL)")) 
    { 
     die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}'); 
    }else 
    die('{"jsonrpc" : "2.0", "error" : {"code": 420, "message": "File upload failed."}, "id" : "id"}'); 
} 
?> 
+0

虽然没有直接上传到S3。这是上传到您的服务器,然后上传到S3。不必要的浪费带宽,时间和处理能力。 – ceejayoz 2014-11-04 14:09:44

+0

对不起,我正在寻找一种方法将文件上传到我的S3存储桶。现在我将删除Plupload“代码”部分。我知道这是浪费带宽! – Roberto 2014-11-04 14:12:21