Amazon AWS S3 принудительно загружает Mp3-файл вместо его потоковой передачи

#amazon-s3 #amazon-web-services #content-disposition

#amazon-s3 #amazon-веб-сервисы #расположение содержимого

Вопрос:

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

Буду признателен за любую помощь. Спасибо

Ответ №1:

Для этого вам необходимо установить заголовок Content-Disposition:

 Content-disposition: attachment; filename=song.mp3
  

Я не думаю, что это возможно с S3Fox. Вы могли бы использовать Bucket Explorer (не бесплатный) или написать скрипт для загрузки файлов.

Комментарии:

1. Хм, что бы это был за скрипт? Не могли бы вы сделать это, например, с помощью s3cmd ( s3tools.org/s3cmd )?

2. Я не уверен насчет s3cmd. Смотрите это сообщение на форуме developer.amazonwebservices.com/connect / … . Вы можете использовать REST API для установки заголовков. Amazon предоставляет библиотеки для многих языков (Ruby, python, C #). Для написания скрипта вы можете использовать язык по вашему выбору.

3. спасибо за ваш ответ, я использую CloudBerry (бесплатную программу) для установки заголовка содержимого. Это работает отлично! большое спасибо

4. Спасибо @kgiannakakis, хорошее решение. Я установил заголовок с помощью Cloudberry Explorer для S3.

Ответ №2:

Хорошо, прошло много времени с тех пор, как вы спрашивали об этом, но у меня была такая же проблема, и я хотел бы поделиться своим решением с сообществом, на случай, если кому-то еще понадобится решить эту проблему. Конечно, вы можете изменить тип содержимого и расположение содержимого с консоли Amazon S3, но самое интересное — сделать это программно.

Следующий код отлично работает для меня:

 require_once '../sdk-1.4.2.1/sdk.class.php';

// Instantiate the class
$s3 = new AmazonS3();

// Copy object over itself and modify headers
$response = $s3->copy_object(
    array( // Source
        'bucket' => 'your_bucket',
        'filename' => 'Key/To/YourFile'
    ),
    array( // Destination
        'bucket' => 'your_bucket',
        'filename' => 'Key/To/YourFile'
    ),
    array( // Optional parameters
        'headers' => array(
            'Content-Type' => 'application/octet-stream',
            'Content-Disposition' => 'attachment'
        )
    )
);

// Success?
var_dump($response->isOK()); 
  

Надеюсь, это поможет другим, кто борется с той же проблемой.

Ответ №3:

В итоге это стало моим решением для принудительной загрузки файлов из AWS S3.

В safari файлы загружались в виде HTML-файлов, пока я не перестал возвращать readfile и просто запустил функцию самостоятельно.

   public function get_download($upload_id)
  {
    try {
      $upload = Upload::find($upload_id);
      if ($upload->deleted)
        throw new Exception("This resource has been deleted.");

      if ($upload->filename == '')
        throw new Exception("No downloadable file found.  Please email info@clouddueling.com for support.");

      header("Content-Description: File Transfer");
      header("Content-Type: application/octet-stream");
      header("Content-Disposition: attachment; filename={$upload->uploaded_filename};");

      readfile("https://s3.amazonaws.com/stackoverflow/uploads/" . $upload->filename);
      exit;
    } catch(Exception $e) {
      return $e->getMessage();
    }
  }
  

Комментарии:

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

2. @davidjbullock Не уверен, было это или нет, но это был плохой пример. Я обновил свой пример, чтобы отразить то, что я делаю лучше.

Ответ №4:

В окне консоли управления s3 щелкните правой кнопкой мыши и выберите свойства.

Нажмите на метаданные.

Нажмите «Добавить дополнительные метаданные»

Ключ: значение размещения содержимого: вложение

Сохранить. Вот и все.