2017-08-26 113 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個問題,你給我兩個答案,我真的不知道怎麼可以報答你的幫助,但現在,我真的很感激你,謝謝很多人! –