【问题标题】:yii2 php how to dynamically generate download file link for file bigger size like 650 MByii2 php如何为650 MB等更大的文件动态生成下载文件链接
【发布时间】:2015-06-22 09:59:03
【问题描述】:

我有一个网站,人们会来这里填写表格,然后他们会收到下载数据集文件的链接,每个文件大小为 650 MB。我不想使用硬编码路径,否则我的表单将无用,人们将开始通过硬链接下载这些文件。

我不确定如何生成具有这种能力的动态随机链接文件以提供 650 MB 大小的文件。

【问题讨论】:

  • 除非文件每次都是即时生成的,或者您在多次请求或一段时间后删除文件,否则不确定您是否可以阻止某人通过链接本身请求文件.
  • 您可以将链接/哈希存储在数据库中,并通过重定向器使其可用于多种用途。

标签: php download yii2 web-site-project


【解决方案1】:

这是一项高级任务,但并非不可能。首先,从创建具有以下字段的数据库表开始:id、file_path、hash、active - 之后为这个表创建 Active Record 模型。

在控制器中创建需要$hash作为参数的下载动作,并在其中放置以下逻辑:

<?php
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');
}

下载视图:

<?php
if (file_exists($file)) {
    Yii::$app->response->sendFile($file);
}

然后,在您的表单控制器中,根据当前时间和一些表单字段生成 md5 哈希(只是为了避免重复的哈希)。对于每个链接,将新模型保存在数据库中。最后,使用 hash 参数渲染链接。

Url::toRoute('file/download', ['hash'=>$hash])

【讨论】:

  • 一个更有用的方法:Yii::$app->response->sendContentAsFile($content, $name);
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多