2017-08-26 104 views
1

这是我的问题: 我有一个系统,用户可以看到有关特定帖子的信息;对于“销售”部分中的示例,用户可以看到关于一种产品的所有信息;并且在每个产品中,用户可以下载文件,例如下载PDF;或MP3,在这种情况下,一个MP3文件: 那么,系统保存所有关于用户下载的文件的记录,并保存记录后,下载文件: 我确切的问题是,文件记录donwloaded保存在数据库中,但是,从不开始下载;我有2间的关系,而且,一个有声读物可以有数倍的下载,但是,一个donwload,只是有1个有声读物:Laravel从数据库中下载文件

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

这是我的代码,在下载suposse开始:

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

所有文件的文件夹里面,proyect和文件夹的路径的公共文件夹内是DB:

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

而且我得到了这个错误:

(1/1) FileNotFoundException The file "/home/vagrant/Code/BDC/public/uploads/audiobooks/audiobook_location/1.m‌​p3" does not exist

哪里是1.MP3,必须是该文件的用户试图下载

我需要下载一个职位只有一个文件,名称;如果有人能帮助我,我会很感激!

+0

'所有文件 - 他们在哪里保存,在什么模型?你的模型之间有什么关系?你有一个'audiobooks_id',是不是在该ID的记录中的文件名? –

+0

有两个不同的变量'$ download'和'$ downloads', 也改变'public_path()。'/ uploads/audiobooks/audiobook_location/test.m p3''到'public_path()。'/ uploads /有声读物/ audiobook_location /”。 $ download-> audiobooks_id。'。m p3''并将'$ audiobook'而不是'$ downloads'传递给'download'方法 –

+0

那么,保存在公共路径中的文件,公共路径的路径在数据库中,并且当管理员上传一个新的后,将上传这些文件:关系是为了显示用户的配置文件中的所有记录,没关系,现在,我将更改变量并尝试,让我看看 –

回答

1

您还没有表现出你的路线,但我猜你有一个这样的:

Route::get('/some/path/download/{id}', '[email protected]'); 

我想传递给你的downloadAudiobook方法必须是有声读物的ID $id

首先,这一行就没有意义了,因为这里的$id不涉及登录的用户:

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

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

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

接下来 - 您没有向我们展示您的有声书模型,但我假设您必须有filename列 - 或者您提到的是audiobook_location?所以,你可以检索audibook记录,并在下载响应中使用的文件名:

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

完整代码:中保存的Database`

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'); 
     } 
} 
+0

我已经试过你的答案了,我真的,真的很感谢你,男人 你现在帮我2个问题,你给我两个答案,我真的不知道怎么可以报答你的帮助,但现在,我真的很感激你,谢谢很多人! –