2

jqueryfileupload 플러그인과 AWS의 통합 작업을하고 있습니다. 업로드 섹션을 성공적으로 완료했지만 지금은 이미지 크기 조정 기능을 통합하려고합니다.
this 플러그인 코드를 사용하고 있습니다. 아래에 나와있는 최소 코드를 사용하여 예제를 설정했습니다.
이미지를 S3에 업로드하기 위해 AWS php sdk와 JqueryUpload 플러그인을 통합

index.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를 사용하여 이미지를 업로드해야하고 플러그인 코드가 작동하지 않습니다. 위에서 언급 한 것처럼 업로드 부분을 구현했지만 upload.ie 전에 이미지 축소판 및 다른 크기의 이미지를 만드는 데 도움이 필요합니다. 이미지를 업로드하려면 3 가지 변형 ex: original,1024x768,100x100이 필요합니다.
UploadHandler.php에는 크기 조정 된 이미지를 만들기위한 기능이 거의 없습니다. 예 : 크기 조정을위한 protected function create_scaled_image($file_name, $version, $options). 나는 OO php와 AWS를 처음 접했을 때 이러한 함수들을 통합하는데 막혔다.
어느 하나 비슷한 짓을하고 입력이 도움이 될 것입니다 줄 수
당신이 awssdk.php에 코드 내부 UploadHandler 클래스의 메소드를 사용하려고하는 것 같다 당신에게

+1

정확히 붙어있는 부분을 언급하지 않았습니까? 이미 업로드가 작동하는 경우 섬네일을 만들기 위해 더 많은 코드를 추가하는 데 문제가 있습니까? – rineez

+0

네,하지만 UploadHandler.php에서와 같은 기능을 사용하고 싶습니다. (링크를 추가했습니다.) 위대한 기능을 제공하는 멋진 기능을 가지고 있지만, 일부 종속성이 관련되어 있습니다. 그 함수들은 다음과 같습니다 : 스케일링 등을 위해'protected function create_scaled_image ($ file_name, $ version, $ options)'예 – KillABug

답변

2

감사드립니다.

나는 올바른 방법으로 UploadHandler 클래스를 커스터마이징 할 것이라고 생각한다. 구체적으로는 handle_file_upload 함수이다. 이 방법으로 UploadHandler 클래스의 모든 좋은 기능에 액세스 할 수있게되면 더 유용 할 것입니다.

그리고 당신은 당신의 awssdk.php

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

당신은이 기능의 코드가 "upload_dir"옵션에서 설정 한 경로에 업로드 된 파일을 저장하고 볼 수있는 단지 다음 줄을 넣을 수 있습니다. 해당 함수 내에 S3 클래스의 객체를 만들고 업로드 된 파일을 S3에 저장하도록 코드를 변경하면됩니다.

나는

move_uploaded_file($uploaded_file, $file_path); 

이 될해야 당신이 UploadHandler에서 변경해야합니다 라인이 아마 라인 (703) 생각 :

$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은 분할 업로드를 처리하는 것으로 보입니다 (확실하지 않습니다). 그 사건을 처리하기를 원할 경우에도이를 변경해야합니다.

+0

그렇지만 upload_dir에 설정된 경로는 S3 디렉토리의 경로 여야합니다. 그러나 S3 디렉토리는 모두 http : //'그리고 그것은 내가 길을 그렇게 할 수있게하지 않을 것이다. 나는 이것을''upload_dir '=> dirname ('https://s3.amazonaws.com/elasticbeanstalk-us-east-1-966938761981/ ' images/'), 'upload_url '=>'https : //s3.amazonaws.com/elasticbeanstalk-us-east-1-966938761981/images/ ',' – KillABug

+0

'move_uploaded_file' -> move에 대해이 오류가 발생합니다 -uploaded-file </a >] : 스트림을 열지 못했습니다 : HTTP 래퍼 d oes는 위의 설명에서와 같이 경로를 변경하면 쓰기 가능한 연결을 지원하지 않습니다. – KillABug

+1

응답에 감사하지만 나 자신을 도우려고 노력하고 있습니다. 도움이 필요합니다. '이 사례를 처리하려면 해당 사례를 처리해야합니다. 먼저 파일을 서버에 업로드 한 다음 S3로 파일을 전송하십시오. AWS 자체가 PUT을 통한 업로드를 지원하므로이 라인을 얻지 못했습니다 – KillABug

2

어쩌면 무엇을 찾고 계십니까 스트림 래퍼입니다. 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가 내 계정을 승인 할 것을 기다리고 있습니다. 그래서 어떤 솔루션도 테스트 할 수 없었습니다.

+0

yes cassiano, 나는 그것을 작동 시켰습니다. – KillABug

관련 문제