我已经将用户头像上传到Laravel存储。如何访问它们并在视图中呈现它们?

服务器正在指向所有请求/public,所以如果他们在/storage文件夹中,我该如何显示

分享改善这个问题
 

5答案  正确答案 

最好的方法是创建一个符号链接像@SlateEntropy相当不错,指出了下面的答案为了帮助这个,从5.3版本开始,Laravel 包含一个令人难以置信的简单操作的命令

php artisan storage:link

从创建一个符号链接public/storagestorage/app/public你,这一切就是这么简单。现在/storage/app/public可以通过以下链接访问任何文件

http://somedomain.com/storage/image.jpg

如果由于任何原因,您无法创建符号链接(也许您在共享托管等),或者您想要保护某些访问控制逻辑背后的某些文件,则可以选择使用特殊的路由读取和提供图像。例如一个简单的闭包路由,如下所示:

Route::get('storage/{filename}', function ($filename)
{
    $path = storage_path('public/' . $filename);

    if (!File::exists($path)) {
        abort(404);
    }

    $file = File::get($path);
    $type = File::mimeType($path);

    $response = Response::make($file, 200);
    $response->header("Content-Type", $type);

    return $response;
});

现在,您可以像使用符号链接一样访问文件:

http://somedomain.com/storage/image.jpg

如果您使用干预图像库,您可以使用其内置response方法来使事情更加简洁:

Route::get('storage/{filename}', function ($filename)
{
    return Image::make(storage_path('public/' . $filename))->response();
});

警告

请记住,通过手动提供文件,您会产生性能损失,因为您将通过整个Laravel请求生命周期来读取和发送文件内容,这比HTTP服务器处理相当慢

分享改善这个答案
 
   
这似乎很好 我想再问一个问题。是否建议在存储中存储文件,如头像,拇指等(从用户上传的文件)? -  TadeášJílek 5月12日星期五13:23
4 
您可以将它们存储在任何您想要的位置,但除非是私有文件,否则我认为您最好将它们存储在public目录中。这样,您将避免使用HTTP服务器更快地处理图像响应的开销。 -  博格丹 5月12日15时13分27分
2 
就个人而言,我不会将用户文件存储在公用文件夹中,当存储文件夹用于存储时,我发现更加整洁,更易于管理。 -  SlateEntropy 5月12日15时13分31分
2 
我不会推荐任何一个,因为那么你再加上加载Laravel和/或利用PHP读取每个图像的开销。使用CmdSft所描述的符号链接会更快。 -  user1960364 Feb 28 '16 at 7:39
3 
@ user1960364这就是为什么最后一段强烈建议使用符号链接方法。但是答案本身虽然不是从性能的角度来看最好的解决方案,但仍然是有效的,并且可能是在共享服务器上运行应用程序的人的唯一方法,其中可能无法设置符号链接。答案还展示了如果有需要,可以按程序方式提供文件,也许是为了提供这个问题中提到的加密文件 -  Bogdan Feb 28 '16 at 12:37

一个选择是在存储目录中的子文件夹和公用目录之间创建一个符号链接。

例如

ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars

这也是由所使用的方法Envoyer,泰勒Otwell,Laravel的开发者建立了一个部署管理器。

分享改善这个答案
 
   
我有点新 这需要在终端上运行,或者在laravel中的某个配置文件中定义? -  Gaurav Mehta 1月7日16日23时54分
   
是的,你需要通过命令行运行它。需要在部署应用程序的任何地方进行设置。 -  SlateEntropy Jan 8 '16 at 11:37
   
对于Windows用户,如果您不想使用CMD,这里是一个独立的工具:github.com/amd989/Symlinker#downloads -  David Mar 29 '16 at 18:59
2 
问题是如何显示storage公开存储的用户头像,通常头像不需要任何访问控制。如果不需要任何安全性,使用任何类型的中间件或路由只是浪费您的资源。还值得注意的是,Laravel 5.2对于使用符号链接的公共文件(laravel.com/docs/5.2/filesystem存在一个单独的文件“磁盘”  -  SlateEntropy Apr 14 '16 at 11:09
3 
在Laravel 5.3中有一个工匠指挥:$ php artisan storage:link -  Phil Nov 11 '16 at 12:29

如果你在Windows上可以运行cmd命令:

mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars 

来自:http : //www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html

分享改善这个答案
 

根据Laravel 5.2文档,您可公开访问的文件应该放在目录中

storage/app/public

为了让他们从网络访问,您应该创建符号链接public/storagestorage/app/public

ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage

现在您可以在视图中使用资产助手创建文件的URL:

echo asset('storage/file.txt');
分享改善这个答案
 

如果你使用php只是使用php syslink函数 symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')

将用户名和项目名称更改为正确的名称

分享改善这个答案
 

保护社区♦ 5月29日在'16 6:09

感谢您对此问题的关注。因为它吸引了低质量或垃圾邮件的答案,必须删除,所以现在发布答案需要在这个网站10 声望协会奖金不算)。 

你想回答这些回答的问题之一吗?

不是你要找的答案?浏览其他问题标记 或问自己的问题

来自 http://stackoverflow.com/questions/30191330/laravel-5-how-to-access-image-uploaded-in-storage-within...


Laravel 5 - 我们如何从存储中访问图像

SARATHISCOOKIE 发表于1年前

我需要在页面加载时查看配置文件图片。我已经使用laravel存储上传图像,但我不知道如何检索和查看图像。请检查我的下面的代码,并帮助我。

当前图像文件夹是storage / app / 1 / 1.jpeg

Laravel Code

public function index()
{
        $id = Input::get('id');
        User::findOrFail($id);
        $file = Storage::get($id.'/'.$id.'.'.'jpeg'); 
        return response($file, 200)->header('Content-Type', 'image/jpeg');
}

JS

<script>
    $(function(){
        $.post("/viewProfile/image", { id: 1 })
                .done(function( data ) {
                    $('#responseImage').html('<img src="'+data+'">');
        });
    })
</script>

路线

Route::post('/viewProfile/image',[
    'before'  => 'csrf',
    'as'      => 'viewprofileimage',
    'uses'    => 'ProfileimageController@index']);

HTML

<div id="responseImage"> </div>
Snapey
 Snapey
1年前(465,615 XP)

Blimey ...从哪里开始?

在控制器中,你只想返回文件路径?这是一个文本字符串,而不是一个图像/ jpg

如果您只是在浏览器中点击该路线,您是否可以获得图像路径?使用Postman(https://www.getpostman.com/),如果您需要生成一个帖子请求(但大多数只是代码Route::get(/viewProfile/image/{id})

(事实上​​你应该做的是模糊路径,以便有人不能抓住所有的个人资料图片 - 参见https://philsturgeon.uk/http/2015/09/03/auto-incrementing-to-destruction/ )

如果您实际在响应中流式传输图像,则可以使用内容类型标题。

这是一个单一的页面应用程序,您正在试图获得客户端的所有资产?你在使用一些框架吗?

 
taijuten
 taijuten
1年前(48,685 XP)

或者,请看https://github.com/thephpleague/glide

默认情况下,这将从您的存储中渲染图像,并允许您进行各种各样的事情,如裁剪,颜色校正等。

 
sarathiscookie
sarathiscookie
1年前(7,270 XP)

@Snapey,我的firebug控制台显示响应。一些编码数据,如“ ?JFIF ????,?, C ” 状态为200 OK 190ms

 
Snapey
 Snapey
1年前(465,615 XP)

忘记firebug ...你期望什么返回?图像或图像的路径?

 
sarathiscookie
sarathiscookie
1年前(7,270 XP)

@Snapey,我期待的形象。目前没有路径存储在数据库中。这是个问题吗?

 
Snapey
 Snapey
1年前(465,615 XP)

我不认为你可以使用img src标签?

您将需要使用它作为内联数据和base64编码流

http://www.websiteoptimization.com/speed/tweak/inline-images/

请告诉我们您正在尝试什么,为什么这是Ajax调用?

 
sarathiscookie
sarathiscookie
1年前(7,270 XP)

@Snapey,我试图在ajax和laravel存储的帮助下查看配置文件图片

 
Snapey
 Snapey
1年前(465,615 XP)

对所有的问题抱歉 这里的聪明人可能会修复你的代码,但这并不一定意味着它是正确的代码。

有很多方法来实现同样的事情,所以当有人似乎在做这个困难的方法时,问题是为什么?你想解决什么样的问题?

为什么在这一段代码中,当您第一次将视图发送给用户时,您不需要再考虑图像?

 
sarathiscookie
sarathiscookie
1年前(7,270 XP)

@Snapey,我会解释一下。它是一个用户个人资料页面。当用户登录系统时,他们可以查看他们的个人资料页面。例如用户ID为1.在我的代码中,我尝试将该用户ID“1”传递给控制器​​页面并获取特定用户的图像。用户图像存储在storage / app / 1 / 1.jpeg下。我认为这将会得到一个整体的想法。

 
Snapey
 Snapey
1年前(465,615 XP)

好的,为什么你不把视图传递给图像的URL。

为了帮助,在你的UserController中创建一个函数;

    public function getProfileImage(){

    return Storage::get($this->id.'/'.$this->id.'.jpeg');
    }

然后在你看来,只要做

name: { { $user->name } }
email: { { $user->email } }

photo: <img src="{ { $user->getProfileImage } }" />

(请注意,我不得不将论坛的大括号加倍空间)

 
martinbean
 martinbean
1年前(253,765 XP)

@sarathiscookieusers数据库表中的配置文件图片文件存储在名为avatar_filename或类似的列中然后,当用户上传它时,将实际的图像文件移动到可访问Web的目录,像public / img / avatar这样的地方

获取用户时,您将获得文件名。所以如果我上传一个名为example.jpg的文件,那么路径将是public / img / avatars / example.jpg所以在你看来,你可以这样做:

<img src="{{ asset('img/avatars/'.$user->avatar_filename) }}" alt="Avatar" />

您还需要确保文件名不会冲突,即如果两个用户上传具有相同文件名的配置文件图像。就个人而言,我使用uniqid()PHP函数,并将其用作已上传图像的文件名。在配置文件图片的情况下,没有理由不能用用户的主键(即sha1($user->getKey())的哈希命名它们这意味着您不会通过文件名来暴露用户的ID。

 
sarathiscookie
sarathiscookie
1年前(7,270 XP)

@Snapey,我的控制器页面是ProfileimageController.php。我已经创建了你所提到的功能。我如何获取<img标签?

 
Snapey
 Snapey
1年前(465,615 XP)

对不起,我应该说你的用户模型中创建这个功能

 
balasubramani
 balasubramani
9个月前(32,090 XP)

嗨,我也面临同样的问题。Storage :: get不返回文件路径。它返回内容。如果内容出现如何处理图像,PDF等...

调节器

$path=Storage::get('pdf/a.jpg');
return view('test.view', compact('path'));

视图

<img src="{{ $path }}" >
 
Snapey
 Snapey
9个月前(465,615 XP)

@balasubramani存储不公开。您无法在那里保存文件,然后创建到它们的Web链接。这个线程是关于能够使用laravel拦截图像的调用,从私有存储获取它,并将文件流传输给客户端。

开始你自己的线程,你正在尝试做什么,以及你迄今做了什么。
 

 balasubramani
9个月前(32,090 XP)

@Snapey

感谢您的指导。

我想保护每个文件。所以只有我选择存储位置。获取文件内容的流式传输方式。

这是编程的正确方法。

调节器

$path=Storage::get('pdf/pdf.pdf');

查看文件

<embed width="100%" height="100%" src="data:application/pdf;base64,{{ base64_encode($path) }}">

感谢您的回复。

 
Snapey
 Snapey
9个月前(465,615 XP)

@balasubramani

我不会建议您以这种方式尝试嵌入大型文件的内容。看看https://laravel.com/docs/5.2/responses#file-downloads

http://laravel.io/forum/04-23-2015-securing-filesimages

您需要做的是创建专门用于下载pdf的路线,然后通过视图中的链接引用该路线。

 
maikealame

我这样做:

Route::get('/image/{path}/{file}', ['as'=>'image', 'uses'=>'ImageController@getImage']);
public function getImage($path,$file){
        if($file){
            $url = $path."/".$file;
        }else{
            $url = $path;
        }
        $path = storage_path("app/") . $url;

        if(!File::exists($path)) abort(404);

        $file = File::get($path);
        $type = File::mimeType($path);

        $response = Response::make($file, 200);
        $response->header("Content-Type", $type);

        return $response;
}

现在,我可以使用我的ACL这个路由或控制器内的其他条件规则。

来自 https://laracasts.com/discuss/channels/laravel/laravel-5-how-can-we-access-image-from-storage