【问题标题】:Laravel Download files from databaseLaravel 从数据库中下载文件
【发布时间】:2018-02-04 10:45:38
【问题描述】:

这是我的问题: 我有一个系统,用户可以在其中查看有关特定帖子的信息;例如,在“销售”部分,用户可以看到有关一种产品的所有信息;并且在每个产品中,用户都可以下载文件,例如下载 PDF;或 mp3,在这种情况下,是一个 mp3 文件: 好了,系统保存了用户下载文件的所有记录,保存记录后,下载文件: 我的确切问题是,下载的文件记录保存在数据库中,但是,从不开始下载;我有 2 个关系,有声读物可以有多个下载,但是,下载,只有 1 个有声读物:

public function downloads() //One download for one audiobook
{
    return $this->hasMany('\bdc\AudiobookDownload');
}

public function audiobooks() //Multiples download for one audiobook
{
    return $this->belongsTo('\bdc\AudioBook');
}

这是我的代码,下载开始的地方:

public function downloadAudiobook($id)
{
        if (Auth::user())
        {
            $userCheck = Auth::user()->$id;
            $download = AudiobookDownload::where(['user_id' => $userCheck, 'audiobooks_id' => $id])->first();
            if (empty($download->user_id))
            {
                $user_id = Auth::user()->id;
                $audiobooks_id = $id;
                $download = new AudiobookDownload;
                $download->user_id = $user_id;
                $download->audiobooks_id = $audiobooks_id;
                $download->save();
            }
        $download = public_path().'/uploads/audiobooks/audiobook_location/' . $download->audiobooks_id .'.m‌​p3';
            return response()->download($download);
        }
        else
        {
            return redirect()->route('login')->with('validate', 'Por favor inicia sesión para descargar este audiolibro');
        }
}

所有文件都在一个文件夹里面,在项目的public文件夹里面,文件夹的路径在DB里面:

$table->string('audiobook_location')->nullable();

我得到了这个错误:

(1/1) FileNotFoundException 文件 “/home/vagrant/Code/BDC/public/uploads/audiobooks/audiobook_location/1.m‌​p3” 不存在

1.mp3 在哪里,必须是用户尝试下载的文件的名称

我只需要下载一篇文章的一个文件;如果有人可以帮助我,我将非常感激!

【问题讨论】:

  • all the files that are saved in Database - 它们保存在哪里,在什么模型中?你的模型之间有什么关系?你有一个audiobooks_id,记录中的文件名不是那个ID吗?
  • 有 2 个不同的变量 $download$downloads,也将 public_path().'/uploads/audiobooks/audiobook_location/test.m‌​p3' 更改为 public_path().'/uploads/audiobooks/audiobook_location/'. $download->audiobooks_id .'.m‌​p3' 并将 $audiobook 而非 $downloads 传递给 download 方法
  • 嗯,保存在公共路径中的文件,公共路径的路径在数据库中,当管理员上传新帖子时,将上传这些文件:关系是为了显示所有记录在用户的个人资料中,没关系,现在,我将变量更改并尝试,让我看看
  • @Don'tPanic audiobooks_id 引用了有声读物表上的Id,在这种情况下,关系是Model Audiobook.php中的hasMany downloads和AudiobookDonwload.php中的BelongsTo有声读物: public function downloads() { return $this->hasMany('\bdc\AudiobookDownload'); } 公共函数有声读物() { 返回 $this->belongsTo('\bdc\AudioBook');我有这个,原因,下载后我需要显示每个用户的下载,而且,这一切都是正确的而且,这些文件都在公共文件夹中,在哪里划分的项目的所有文件
  • 但是,我得到了下一个错误,我将代码更改为下载,现在,我有了这个: $download = public_path().'/uploads/audiobooks/audiobook_location/' 。 $download->audiobooks_id .'.m‌​p3';返回响应()->下载($下载);以及点击按钮后的结果;假设开始下载的结果是:文件“/home/vagrant/Code/BDC/public/uploads/audiobooks/audiobook_location/1.m‌​p3”不存在我需要更改1.mp3,用于Moby_dick.mp3或文件夹内的任何其他文件

标签: php laravel file


【解决方案1】:

你没有显示你的路线,但我猜你有类似的东西:

Route::get('/some/path/download/{id}', 'someController@downloadAudiobook');

我认为传递给downloadAudiobook 方法的$id 必须是有声读物的ID?

首先,这一行没有意义,因为这里的$id 与登录用户无关:

$userCheck = Auth::user()->$id;

我想你想要登录用户的用户 ID:

$userCheck = Auth::user()->id;

接下来 - 您还没有向我们展示您的有声读物型号,但我假设您必须有一个 filename 列 - 还是您提到的 audiobook_location?因此,您可以检索有声读物记录并在下载响应中使用文件名:

$audiobook = AudioBook::find($id);
$download = public_path().'/uploads/audiobooks/audiobook_location/' . $audiobook->audiobook_location;

完整代码:

public function downloadAudiobook($id)
{
        if (Auth::user())
        {
            $userID = Auth::user()->id;
            $download = AudiobookDownload::where(['user_id' => $userID, 'audiobooks_id' => $id])->first();
            if (empty($download->user_id))
            {
                $download = new AudiobookDownload;
                $download->user_id = $user_id;
                $download->audiobooks_id = $id;
                $download->save();
            }

            $audiobook = AudioBook::find($id);
            $download = public_path().'/uploads/audiobooks/audiobook_location/' . $audiobook->audiobook_location;
            return response()->download($download);
        }
        else
        {
            return redirect()->route('login')->with('validate', 'Por favor inicia sesión para descargar este audiolibro');
        }
}

【讨论】:

  • 我已经尝试过你的答案,我真的非常感谢你,伙计你现在帮我解决了两个问题,你给了我两个问题的答案,我真的不知道如何回报你的帮助,但现在,我真的很感激你,非常感谢!
猜你喜欢
  • 2017-04-25
  • 2023-03-09
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多