2

我正在将 jqueryfileupload 插件与 AWS 集成。我已经成功完成了上传部分,但现在我正在寻找集成图像调整大小功能。
我正在使用这个插件代码。我已经使用最低代码设置了一个示例,如下所示。

索引.html

 <!DOCTYPE HTML>
 <html>
 <head>
 <meta charset="utf-8">
 <title>jQuery File Upload Example</title>
 </head>
 <body>
 <input id="fileupload" type="file" name="files[]" data-url="aws/" multiple>
 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
 <script src="js/vendor/jquery.ui.widget.js"></script>
 <script src="js/jquery.iframe-transport.js"></script>
 <script src="js/jquery.fileupload.js"></script>
 <script>
   $(function () {
     $('#fileupload').fileupload({
      dataType: 'json',
      done: function (e, data) {
        $.each(data.result.files, function (index, file) {
            $('<p/>').text(file.name).appendTo(document.body);
        });
      }
    });
  });
   </script>
  </body> 
 </html>

awssdk.php ---这是我选择图像后调用的文件。

      <?php 
    $bucket = "my bucket name";
    $subFolder = "";  // leave blank for upload into the bucket directly
    if (!class_exists('S3'))require_once('S3.php');

    //AWS access info
   if (!defined('awsAccessKey')) define('awsAccessKey', 'my key');
   if (!defined('awsSecretKey')) define('awsSecretKey', 'my secret key');


    $options = array( 'image_versions' => array(
     'small' => array(
    'max_width' => 1920,
    'max_height' => 1200,
    'jpeg_quality' => 95
 ),

'medium' => array(
    'max_width' => 800,
    'max_height' => 600,
    'jpeg_quality' => 80
),

'thumbnail' => array(
    'max_width' => 80,
    'max_height' => 80
)
   ) 
  );

  //instantiate the class
  $s3 = new S3(awsAccessKey, awsSecretKey);

  function getFileInfo($bucket, $fileName) {
   global $s3;
   $fileArray = "";
   $size = $s3->getBucket($bucket);
   $furl = "http://" . $bucket . ".s3.amazonaws.com/".$fileName;
   $fileArray['name'] = $fileName;
   $fileArray['size'] = $size;
   $fileArray['url'] = $furl;
   $fileArray['thumbnail'] = $furl;
   $fileArray['delete_url'] = "server/php/index.php?file=".$fileName;
   $fileArray['delete_type'] = "DELETE";
   return $fileArray;
 }

  function uploadFiles($bucket, $prefix="") {
   global $s3;
   if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {
     return "";
  }
  $upload = isset($_FILES['files']) ? $_FILES['files'] : null;
  $info = array();
  if ($upload && is_array($upload['tmp_name'])) {
foreach($upload['tmp_name'] as $index => $value) {
    $fileTempName = $upload['tmp_name'][$index];
    $fileName = (isset($_SERVER['HTTP_X_FILE_NAME']) ?      $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'][$index]);
    $fileName = $prefix.str_replace(" ", "_", $fileName);
    // $response = $s3->create_object($bucket, $fileName, array('fileUpload' => $fileTempName, 'acl' => AmazonS3::ACL_PUBLIC, 'meta' => array('keywords' => 'example, test'),));
    $response = $s3->putObjectFile($fileTempName,$bucket,'images/'.$fileName,S3::ACL_PUBLIC_READ);
    //print_r($response);
    if ($response==1) {
        $info[] = getFileInfo($bucket, $fileName);
    } else {
             echo "<strong>Something went wrong while uploading your file... sorry.</strong>";
    }
}
} else {
    if ($upload || isset($_SERVER['HTTP_X_FILE_NAME'])) {
        $fileTempName = $upload['tmp_name'];
        $fileName = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : $upload['name']);
        $fileName =  $prefix.str_replace(" ", "_", $fileName);
        //$response = $s3->create_object($bucket, $fileName, array('fileUpload' => $fileTempName, 'acl' => AmazonS3::ACL_PUBLIC, 'meta' => array('keywords' => 'example, test'),));
        $response = $s3->putObjectFile($upload['tmp_name'],$bucket,$fileName,S3::ACL_PUBLIC_READ);
        if ($response->isOK()) {
            $info[] = getFileInfo($bucket, $fileName);
        } else {
                 echo "<strong>Something went wrong while uploading your file... sorry.</strong>";
        }
    }
}
header('Vary: Accept');
$json = json_encode($info);
$redirect = isset($_REQUEST['redirect']) ? stripslashes($_REQUEST['redirect']) : null;
if ($redirect) {
    header('Location: ' . sprintf($redirect, rawurlencode($json)));
    return;
}
if (isset($_SERVER['HTTP_ACCEPT']) && (strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) {
    header('Content-type: application/json');
} else {
    header('Content-type: text/plain');
}
 return $info;
 }
?>

是我正在使用的 S3 类。

JqueryUploadPLugin 附带一个服务器端 PHP 类来上传图片,这很棒。但是当我使用 AWS 时,我必须使用他们的 API 上传图片,插件代码不起作用。正如我上面提到的,我已经实现了上传部分,但在我上传之前需要帮助创建图像缩略图和不同尺寸的图像。即我希望图像以 3 种变体上传ex: original,1024x768,100x100UploadHandler.php几乎没有用于创建缩放图像示例的函数:
用于缩放和其他。因为我是 OO php 和 AWS 的新手,所以我一直在集成这些功能。任何做过类似事情并且可以提供意见的人都会有所帮助 谢谢protected function create_scaled_image($file_name, $version, $options)

4

2 回答 2

2

您似乎正在尝试在 awssdk.php 的代码中使用 UploadHandler 类中的方法

我认为您要走的正确方法是自定义 UploadHandler 类 - 更具体地说是handle_file_upload函数。这可能对您更有利,因为您可以通过这种方式访问​​ UploadHandler 类的所有良好功能。

您可以在您的 awssdk.php 中添加以下几行

require('UploadHandler.php');
$upload_handler = new UploadHandler();

您可以看到当前此函数中的代码将上传的文件存储在“upload_dir”选项中设置的路径中。您只需要S3在该函数内创建一个类的对象并更改代码以将上传的文件存储到 S3。

我认为您必须在 UploadHandler 中更改的行可能是第 703 行。

move_uploaded_file($uploaded_file, $file_path);

应该变成:

$s3 = new S3(awsAccessKey, awsSecretKey);
$response = $s3->putObjectFile($uploaded_file,$bucket,$file->name,S3::ACL_PUBLIC_READ);
if ($response->isOK()) {
    $info[] = getFileInfo($bucket, $fileName);
} else {
   $file->error = "<strong>Something went wrong while uploading your file... sorry.</strong>";
}

您可能还需要将相关代码(例如 getFileInfo 函数)带入 UploadHandler 类。

第 707-711 行似乎用于通过 PUT 方法处理文件上传。要处理这种情况,您必须保留这些行,让文件先上传到您的服务器,然后将文件传输到 S3,然后您可以取消链接服务器中的文件。但是,如果您只允许 POST 方法,则只需注释掉这些行也是安全的。

第 697-701 行似乎用于处理拆分上传(我不确定)。如果您也希望处理这种情况,您也必须更改它。

于 2013-07-05T15:34:06.833 回答
2

也许您正在寻找的是 Stream Wrapper。http://docs.aws.amazon.com/aws-sdk-php/guide/latest/service-s3.html#amazon-s3-stream-wrapper

"The Amazon S3 stream wrapper allows you to store and retrieve data from Amazon S3 using built-in PHP functions like file_get_contents, fopen, copy, rename, unlink, mkdir, rmdir, etc."

我也在寻找相同的解决方案。我已经创建了这个https://gist.github.com/tim-peterson/8172999我它可以提供帮助。我仍在等待 AWS 批准我的帐户,因此我无法测试任何解决方案。

于 2014-09-24T13:34:18.730 回答