2016-08-07 3 views
0

Я хочу использовать PHP в GAE для загрузки файлов файлов изображений.Использование PHP getimagesize и imagecreate с Google App Engine и облачным хранилищем Google

Перед сохранением, я хочу преобразовать каждый файл в JPEG и уменьшить его до качества миниатюр.

Используя следующий код (который полностью работает в обычной среде PHP, меньше настроек в виде ведра), я могу получать загрузки и определять временное имя и местоположение файла, но getimagesize создает ошибку при попытке доступ к CloudStorage.

$bucket = CloudStorageTools::getDefaultGoogleStorageBucketName(); 
$bucketPath = "gs://" . $bucket . "/" . $_SERVER["REQUEST_ID_HASH"] . "/"; 
$counter = 0; 

foreach($_FILES["file"]["name"] as $idx => $tempFile) { 
    $counter++; 
    $sourceFile = $bucketPath . $tempFile; 

    syslog(LOG_DEBUG, $sourceFile); 

    $photoInfo = getimagesize($sourceFile); 
    if ($photoInfo["mime"] == "image/jpeg") { 
     $photoImage = imagecreatefromjpeg($sourceFile); 
     $valid = true; 
    } 
    elseif ($photoInfo["mime"] == "image/gif") { 
     $photoImage = imagecreatefromgif($sourceFile); 
     $valid = true; 
    } 
    elseif ($photoInfo["mime"] == "image/png") { 
     $photoImage = imagecreatefrompng($sourceFile); 
     $valid = true; 
    } 

    if (isset($valid)) { 
     $date = date("Y-m-d H:i:s"); 

     $photoFolder = rtrim($photoFolder, "/") . "/"; 
     $photoFile = "Test {$counter} {$date}.jpg"; 

     $imageSaved = imagejpeg($photoImage, $photoFolder.$photoFile, 50); 

     syslog(LOG_DEBUG, "File saved is " . $imageSaved); 
    } 
} 

Первая запись системного журнала подтверждает путь и имя файла ...

gs://[myappid].appspot.com/AC3E3530/IMG_20160701_120144.jpg 

Журнал ошибок показывает ошибку при попытке открыть поток, но я не знаю, как решить ее ,

PHP Warning: getimagesize(gs://[myappid].appspot.com/AC3E3530/IMG_20160701_120144.jpg): failed to open stream: "\google\appengine\ext\cloud_storage_streams\CloudStorageStreamWrapper::stream_open" call failed in /base/data/home/apps/s~[myappid]/v1.394746390020376247/code/server.php on line 169 

У меня уже есть изменение этой функциональности, работающих на GAE с фотографиями, что мой сервер получает через Twilio (где processPhoto() является функцией идентичен коду I Выдержки выше). В этом случае я использую getimagesize и imagecreate с URL-адресом. Я просто не знаю, как сделать то же самое с CloudStorage.

if ($fetch && $numMedia > 0) { 
    for ($x = 0; $x < $numMedia; $x++) { 
     $sourceFile = $_REQUEST["MediaUrl" . $x]; 
     $sid = $_REQUEST["MessageSid"]; 
     processPhoto("sms", $projectID, $sourceFile, $caption, $sid, $mobile, $message); 
    } 
} 

ответ

1

Я думаю, проблема в том, что временный файл был удален, прежде чем я смог его обработать. Итак, я ...

  1. Удалена функциональность обработки нескольких файлов (что мне не нужно было ).
  2. Сразу же переместите файл в другое ведро.
  3. Осмотрите файл для его типа.
  4. Сохраните его по своему усмотрению.
  5. Удалить временный файл.

Это форма, которую я произвожу в PHP. Нет кнопки «Отправить», потому что я смотрю на изменение файла с помощью jQuery.

<form id='form_uploadPhotos' method='post' enctype='multipart/form-data' action='{$websiteURL}?action=uploadPhotos'> 
    <input type='file' id='input_uploadPhoto' name='file'> 
    <input type='hidden' name='projectID' value='{$projectID}'> 
</form> 

Это функция uploadPhotos, которая вызывается, когда форма была отправлена:

if ($action == "uploadPhotos") { 
    $projectID = preg_replace("/\D/", "", $_REQUEST["projectID"]); 

    $bucket = CloudStorageTools::getDefaultGoogleStorageBucketName(); 
    $bucketPath = "gs://" . $bucket . "/" . $_SERVER["REQUEST_ID_HASH"] . "/"; 

    $date = date("Y-m-d H:i:s"); 
    $time = time(); 

    $photoFile = sprintf("%08d", $projectID) . "." . $date . "." . $time . ".TEMP"; 
    $sourceFile = $photoFolder.$photoFile; // The default photo folder is defined elsewhere. 

    move_uploaded_file($_FILES["file"]["tmp_name"], $sourceFile); 
    processPhoto("upload", $projectID, $sourceFile, null, null, null, null); 
} 

Это функция, которая обрабатывает фотографии. Он вызывается другими процессами, которые также получают фотографии (например, вложения SMS через Twilio).

function processPhoto($via, $projectID, $sourceFile, $caption, $twilioMessageID, $smsMobile, $smsMessage) { 
    global $photoFolder; 

    $photoInfo = getimagesize($sourceFile); 
    if ($photoInfo["mime"] == "image/jpeg") { 
     $photoImage = imagecreatefromjpeg($sourceFile); 
     $valid = true; 
    } 
    elseif ($photoInfo["mime"] == "image/gif") { 
     $photoImage = imagecreatefromgif($sourceFile); 
     $valid = true; 
    } 
    elseif ($photoInfo["mime"] == "image/png") { 
     $photoImage = imagecreatefrompng($sourceFile); 
     $valid = true; 
    } 

    if (isset($valid)) { 
     $date = date("Y-m-d H:i:s"); 
     $time = time(); 
     $photoFile = sprintf("%08d", $projectID) . "." . $date . "." . $time . ".JPEG"; 

     $photoImage = imagecreatefromjpeg($sourceFile); 
     list($width, $height) = getimagesize($sourceFile); 
     if (max($width, $height) > 800) { 
      $scale = 800/max($width, $height); 
      $newWidth = floor($width * $scale); 
      $newHeight = floor($height * $scale); 
      $saveImage = imagecreatetruecolor($newWidth, $newHeight); 
      imagecopyresampled($saveImage, $photoImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 
     } 

     $imageSaved = imagejpeg($photoImage, $photoFolder.$photoFile); 
     imagedestroy($photoImage); 

     if ($imageSaved) { 
      if (isset($twilioMessageID)) { 
       $twilioMediaID = substr($sourceFile, strrpos($sourceFile, "/") + 1); 
       purgeTwilioMedia($twilioMessageID, $twilioMediaID); 
      } 
      elseif (substr($sourceFile, strrpos($sourceFile, ".")) == ".TEMP") { 
       unlink($sourceFile); 
      } 

      <Additional processing (e.g., adding entry to database.) 
      . 
      . 
      . 
     } 
    } 
} 

Примечание: Изображение код масштабирования между "списком ($ ширина, высота $ ..." и «imagecopyresampled ...»основывается на Dano's answer на другой вопрос.

0

Я предполагаю, что вы ударяя limitation of the Standard Environment где getimagesize родной функции в стандартном режиме исполнения не работает с расширениями файлов, как gs:// URL.

+0

Благодарим вас за ответ. Я изучил различия между службами и пришел к выводу, что я недостаточно быстро попадал в файл. Итак, как указано в моем ответе, я теперь переместите файл и оперируйте его в другом месте. –