Скачать файл с AWS S3 и скачать в браузере с другим именем, на PHP?

0

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

Я могу загрузить файлы на сервер с правильным именем файла.

Как загрузить файлы в браузер пользователя вместо сервера? Я использую библиотеку Donovan Schonknecht S3, и я использую S3 :: getObject для чтения файла.

Другая возможность, можно ли связать URL-адрес, например https://s3.amazonaws.com/myfolder/d_b5592038c76db88c4c6113d1fb166fe8e9b1b7b3.pdf, и загрузить его в браузер как myfile.pdf?

Я не хочу загружать файл на сервер, а затем на пользователя.

  • 0
    Это похоже на другой вопрос, на который я отвечал ранее, в котором используется AWS SDK для PHP: stackoverflow.com/questions/18839216/…
Теги:
amazon-web-services
amazon-s3

2 ответа

0

Вы можете попробовать AWS-SDK (официальный). Основная идея заключается в том, чтобы получить подписанный URL-адрес из служб S3, чтобы вы могли сделать ссылку для загрузки доступной для ваших пользователей сайта, не применяя код на стороне сервера. Вы можете сделать это полностью с помощью Javascript.

Дополнительная информация о: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

0

Спасибо за комментарии и сообщения электронной почты... Решение состоит в использовании заголовков и файла readfile. Я использовал пример заголовка Дэвида Уолша http://davidwalsh.name/php-force-download и объединил его с файлом чтения php. Файл readfile считывает файл с именем хеша, а заголовки сохраняют его с другим именем. Оригинальное имя файла или местоположение никогда не отображается для публики. Вот несколько полезных PHP-кода:

// get doc details
$stmt = $conn->prepare("SELECT * FROM docs WHERE docs_hash = :hash LIMIT 1 ");
$stmt->execute(array(':hash' => $docs_hash));
$result = $stmt;

if ($result->rowCount() > 0) {

  foreach($result as $row) {

    $docs_filename    = $row['docs_filename'];
    $docs_extension   = $row['docs_extension'];
    $docs_downloaded  = $row['docs_downloaded'];
    $download_file = "doc_" . $docs_hash . "." . $docs_extension;
  }

  // echo "File 1: $download_file <br>";
  // echo "File 2: $docs_filename <br>";
  // echo "Bucket: " . _AWS_BUCKET_ . "<br>";

  // required for IE
  if (ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off');  }

  // get the file mime type using the file extension
  switch(strtolower(substr(strrchr($docs_filename, '.'), 1))) {
    case 'pdf': $mime = 'application/pdf'; break;
    case 'zip': $mime = 'application/zip'; break;
    case 'jpeg':
    case 'jpg': $mime = 'image/jpg'; break;
    default: $mime = 'application/force-download';
  }
  header('Pragma: public');     // required
  header('Expires: 0');     // no cache
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Cache-Control: private', false);
  header('Content-Type: ' . $mime);
  header('Content-Disposition: attachment; filename="' . basename($docs_filename) . '"');
  header('Content-Transfer-Encoding: binary');
  header('Connection: close');
  readfile("https://s3.amazonaws.com/" . _AWS_BUCKET_ . "/" . $download_file);
  exit();

}
  • 1
    контент-расположение ваш друг, безусловно. (Я пришел сюда, чтобы предложить это)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню