【问题标题】:Laravel: Refresh response()->fileLaravel:刷新响应()->文件
【发布时间】:2018-04-20 16:54:56
【问题描述】:

在 Laravel 中我使用这条路线

Route::get('admin/showBill/{file}','Admin\FileController@showBill');

还有这段代码

class FileController extends AuthController
{
  public function showBill($file)
  {
    $path = storage_path('app/bills/' . basename($file)  );
    if(!\File::exists($path)) return back();
    return response()->file($path);
  }

从我的存储文件夹中显示一个 pdf。

所以,如果我的/storage/app/bills/ 文件夹中有pdf bill-1.pdf,那么我可以使用网址查看它

example-domain.com/admin/showBill/bill-1.pdf

问题是,如果我用浏览器打开那个 pdf,替换它,然后刷新 (F5) 页面,就会显示旧账单。我猜是因为它存储在缓存中。我可以强制 Laravel 显示新替换的文件吗?

我试过了

 public function showBill($file)
 {
    $path = storage_path('app/bills/' . basename($file)  );
    if(!\File::exists($path)) return back();
    $path  .= '?v='. time();
    return response()->file($path);
 }

但是 Laravel 告诉我这个文件不存在。我正在寻找一种无需重命名 pdf 文件的解决方案。

【问题讨论】:

    标签: php laravel-5 browser-cache


    【解决方案1】:

    您确定要替换正确的文件吗?

    如果是这样,请放置此dd()。我创建了一个端点,响应一个空的 pdf 文件 - 查看它 - 用一个内容填充的 pdf 文件替换它,当我替换它时它工作得很好。

    编辑:另外,您应该使用表单请求或在控制器中验证来验证 $file 变量。

    public function showBill($file)
     {
        $path = storage_path('app/bills/' . basename($file));
        if(!\File::exists($path))  { 
         dd("Quite possibly the problem is here, on the redirect back");
        }
        return response()->file($path);
     }
    

    【讨论】:

    • 好吧,我试着找出答案。您会为 $file 变量推荐哪种验证方式?我使用 basename 来确保它不是路径。文件名甚至可以由空格和 utf8 字符组成,所以我不知道要检查什么,除非文件存在。并且该文件必须存在,否则浏览器应该将我重定向回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2014-08-28
    • 2021-02-16
    • 2015-05-31
    • 2011-03-19
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多