Laravel 下载文件

Posted

技术标签:

【中文标题】Laravel 下载文件【英文标题】:Laravel download files 【发布时间】:2018-02-02 22:44:40 【问题描述】:

我希望用户能够在我的 Laravel 应用程序中下载文件。我在公共文件夹中有很多文件,每个文件都属于一个帖子。例如,当管理员创建新帖子并上传文件(例如帖子中的图片)时,用户可以下载该图片/或 pdf。

我制作了一个按钮,以便用户可以下载文件,但出现错误:

The file "/home/vagrant/Code/BDC/public/uploads/audiobooks/audiobook_location/1" does not exist

这是我的代码,带有一个下载按钮来做“魔术”:

public function downloadAudiobook($id)

    try
    
        if (Auth::user())
        

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

    catch(ModelNotFoundException $e)
    
        Session::flash('flash_message', "Ha ocurrido un error procesando su solicitud, intente mas tarde.");
        return redirect()->back();
    

我知道,我在文件所在的路径中传递了 ID,因为,我不知道该怎么做。

这是我的路线:

Route::get('audiobooks/download/id',['as' => 'audiobooks.download','uses' => 'AudiobookController@downloadAudiobook']);

【问题讨论】:

也许你忘了附加文件扩展名?我想你的路径应该类似于public_path('uploads/audiobooks/audiobook_location/' . $id. '.pdf') 我同意@AndriyLozynskiy,尝试附加文件扩展名。 是的,我愿意,但是,真正的问题是 Laravel 给了我一个“文件”,它是文件的路径:“public/uploads/audiobooks/audiobook_location/1”直到 /audiobook_location/很好,但是,“/1”在哪里需要有文件名才能下载,所以,路径必须是:“public/uploads/audiobooks/audiobook_location/*文件名.mp3”你呢?懂我吗? 你在哪个表存储你的文件名如“test.mp3”? 表格为“有声读物”,该表格中保存了所有以有声读物为主题的帖子的信息文件 【参考方案1】:

你应该试试这个可能是你理解我的回答及其对你的帮助:

public function downloadAudiobook($id)

  try
  
    if (Auth::user())
    
      //Your table where you store your filename and get your file like

      $resltFile = DB::table('yourTableName')->where('id',$id)->first();  


      $audiobook = public_path().'/uploads/audiobooks/audiobook_location/' . $resltFile->fileName;

      return response()->download($audiobook);
    
    else
    
        return redirect()->route('login')->with('validate', 'Por favor inicia sesión para descargar este audiolibro');
    
  

  catch(ModelNotFoundException $e)
  
    Session::flash('flash_message', "Ha ocurrido un error procesando su solicitud, intente mas tarde.");
    return redirect()->back();
  

【讨论】:

好吧,我改变了Somethings,我得到了下一个,首先,改变路线,所以,这是下载按钮: route('audiobooks.download', $audiobooks->audiobook_location ) 其中,audiobook_location 是保存路径的数据库字段: /uploads/audiobooks/audiobook_location/ 并且,为此更改控制器: $audiobook = public_path('public/uploads/audiobooks/audiobook_location/' . $ id.'.mp3');但是,我收到了这个错误:(1/1) NotFoundHttpException;并且,当我单击按钮下载时,重定向到带有路径和文件名的路由,但不下载 @CONFABDC 请将您的 mp3 文件名的静态文件名放在我的回答中,而不是 $resltFile->fileName 并检查工作与否 我把下一个 -> $audiobook = public_path().'/uploads/audiobooks/audiobook_location/' 。 $resltFile->La noche boca arriba Cortazar Julio.mp3;其中 La noche boca arriba.mp3 是保存在公共路径中的文件的名称,我得到了这个: (1/1) FatalThrowableError Parse error: syntax error, unexpected 'noche' (T_STRING);我认为这是因为文件名称之间有空格;我改为 $audiobook = public_path().'/uploads/audiobooks/audiobook_location/' 。 $audiobook -> La noche boca arriba Cortazar Julio.mp3;和是一样的;我真的不知道该怎么办 @CONFABDC 请将La noche boca arriba Cortazar Julio.mp3 重命名为La_noche_boca_arriba_Cortazar_Julio.mp3 并检查 我做了,得到了这个:(1/1) ErrorException Undefined variable: resltFile 明明这个变量不存在,怎么改?

以上是关于Laravel 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3 保护下载文件的正确方法

Laravel:无法下载生成的文件

从 Laravel 下载文件

一旦您下载并注销 Laravel 文件下载就不需要 Auth

Laravel 5:下载文件不显示弹出保存

在 Laravel 中处理加密文件(如何下载解密文件)