= Yii 2 File Download =
Sometimes we need generated URLs to file downloads to avoid people bookmarking a permanent link to a file.
== Create Table ==
Example fields for table ''file'':
CREATE TABLE `file` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`file_path` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
`hash` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
`active` TINYINT(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;
Create Active Record model for this table using Gii.
== Controller ==
Create action ''actionDownload()'' in controller. When downloading, require a $hash as parameter:
class FileController extends Controller
{
//...
public function actionDownload($hash)
{
$model = FileModel::find()->where(['hash'=>$hash])->one();
if ($model && $model->active == 1) {
$file = $model->file_path;
$model->active = 0;
$model->save(false);
return $this->render('download', ['file' => $file]);
}
return $this->render('downloadLinkExpired');
}
}
== View ==
if (file_exists($file)) {
Yii::$app->response->sendFile($file);
}
Then, in form controller
* Generate an MD5 hash based on current time and maybe some form fields (just to avoid duplicated hash).
* For every link, save new model in database.
* Render links with hash parameter. Url::toRoute('file/download', ['hash'=>$hash])
Source: [[http://stackoverflow.com/questions/30977078/yii2-php-how-to-dynamically-generate-download-file-link-for-file-bigger-size-lik|StackOverflow: Yii2 - How to dynamically generate download file link]]