diff --git a/airtime_mvc/application/cloud_storage/Amazon_S3StorageBackend.php b/airtime_mvc/application/cloud_storage/Amazon_S3StorageBackend.php index 270015ae0..0d86ef52c 100644 --- a/airtime_mvc/application/cloud_storage/Amazon_S3StorageBackend.php +++ b/airtime_mvc/application/cloud_storage/Amazon_S3StorageBackend.php @@ -42,12 +42,12 @@ class Amazon_S3StorageBackend extends StorageBackend } /** Returns a signed download URL from Amazon S3, expiring in 60 minutes */ - public function getDownloadURLs($resourceId) + public function getDownloadURLs($resourceId, $contentDispositionFilename) { $urls = array(); - $signedS3Url = $this->s3Client->getObjectUrl($this->getBucket(), $resourceId, '+60 minutes'); - + $s3args = array('ResponseContentDisposition' => 'attachment; filename="' . $contentDispositionFilename. '"'); + $signedS3Url = $this->s3Client->getObjectUrl($this->getBucket(), $resourceId, '+60 minutes', $s3args); //If we're using the proxy cache, we need to modify the request URL after it has //been generated by the above. (The request signature must be for the amazonaws.com, diff --git a/airtime_mvc/application/cloud_storage/FileStorageBackend.php b/airtime_mvc/application/cloud_storage/FileStorageBackend.php index e7a87147e..1e111daf1 100644 --- a/airtime_mvc/application/cloud_storage/FileStorageBackend.php +++ b/airtime_mvc/application/cloud_storage/FileStorageBackend.php @@ -13,7 +13,7 @@ class FileStorageBackend extends StorageBackend return $resourceId; } - public function getDownloadURLs($resourceId) + public function getDownloadURLs($resourceId, $contentDispositionFilename) { return ""; } diff --git a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php index d99c62eef..391d34ac3 100644 --- a/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php +++ b/airtime_mvc/application/cloud_storage/ProxyStorageBackend.php @@ -38,9 +38,9 @@ class ProxyStorageBackend extends StorageBackend return $this->storageBackend->getAbsoluteFilePath($resourceId); } - public function getDownloadURLs($resourceId) + public function getDownloadURLs($resourceId, $contentDispositionFilename) { - return $this->storageBackend->getDownloadURLs($resourceId); + return $this->storageBackend->getDownloadURLs($resourceId, $contentDispositionFilename); } public function deletePhysicalFile($resourceId) diff --git a/airtime_mvc/application/cloud_storage/StorageBackend.php b/airtime_mvc/application/cloud_storage/StorageBackend.php index f0d58ba42..890611692 100644 --- a/airtime_mvc/application/cloud_storage/StorageBackend.php +++ b/airtime_mvc/application/cloud_storage/StorageBackend.php @@ -15,7 +15,7 @@ abstract class StorageBackend /** Returns the file object's signed URL. The URL must be signed since they * privately stored on the storage backend. */ - abstract public function getDownloadURLs($resourceId); + abstract public function getDownloadURLs($resourceId, $contentDispositionFilename); /** Deletes the file from the storage backend. */ abstract public function deletePhysicalFile($resourceId); diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index a53e1ae24..e0e7e65b1 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -363,14 +363,6 @@ class CcFiles extends BaseCcFiles { unset($response[$key]); } - $mime = $file->getDbMime(); - if (!empty($mime)) { - // Get an extension based on the file's mime type and change the path to use this extension - $path = pathinfo($file->getDbFilepath()); - $ext = FileDataHelper::getFileExtensionFromMime($mime); - $response["filepath"] = ($path["dirname"] . '/' . $path["filename"] . $ext); - } - return $response; } @@ -385,8 +377,12 @@ class CcFiles extends BaseCcFiles { public function getFilename() { $info = pathinfo($this->getAbsoluteFilePath()); + //filename doesn't contain the extension because PHP is awful - return $info['filename'].".".$info['extension']; + $mime = $this->getDbMime(); + $extension = FileDataHelper::getFileExtensionFromMime($mime); + + return $info['filename'] . $extension; } /** diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index 3f0331ccc..56390e28c 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -32,7 +32,7 @@ class CloudFile extends BaseCloudFile if ($this->proxyStorageBackend == null) { $this->proxyStorageBackend = new ProxyStorageBackend($this->getStorageBackend()); } - return $this->proxyStorageBackend->getDownloadURLs($this->getResourceId()); + return $this->proxyStorageBackend->getDownloadURLs($this->getResourceId(), $this->getFilename()); } /** @@ -49,7 +49,14 @@ class CloudFile extends BaseCloudFile public function getFilename() { - return $this->getDbFilepath(); + $filename = $this->getDbFilepath(); + $info = pathinfo($filename); + + //Add the correct file extension based on the MIME type, for files that were uploaded with the wrong extension. + $mime = $this->getDbMime(); + $extension = FileDataHelper::getFileExtensionFromMime($mime); + + return $info['filename'] . $extension; } /** diff --git a/airtime_mvc/application/services/MediaService.php b/airtime_mvc/application/services/MediaService.php index 55eaeff37..807d6de17 100644 --- a/airtime_mvc/application/services/MediaService.php +++ b/airtime_mvc/application/services/MediaService.php @@ -62,6 +62,7 @@ class Application_Service_MediaService if ($media->getPropelOrm()->isValidPhysicalFile()) { $filename = $media->getPropelOrm()->getFilename(); + //Download user left clicks a track and selects Download. if (!$inline) { //We are using Content-Disposition to specify