Laravel 5.2不允许从存储文件夹加载本地资源

时间:2017-03-12 11:55:17

标签: javascript php laravel-5.2

我正在尝试从dropzone中的存储文件夹中预加载图像。这就是我所拥有的:

AJAX

$.ajax({
    url: "suspect_images",
    data: { id: $('input[name=b_id]').val(), _token: $('input[name=_token]').val()},
    dataType: 'json',
    type: 'GET',
    success: function (data) {
        $.each(data.images, function (key, value) {
            var file = {name: value.original, size: value.size};
            dropZone.options.addedfile.call(dropZone, file);
            dropZone.options.thumbnail.call(dropZone, file, value.path + value.server);
            dropZone.emit("complete", file);
            dropZone.files.push(file);
        });
    },
    error: function (data) {

    }
}, "json")

控制器

$images = Mugshots::select("AccusedID", "FileName", "OriginalFileName")->where("AccusedID", "=", $request->input('id'))->get();

$imageAnswer = [];

foreach ($images as $image) {
    $imageAnswer[] = [
        'original' => $image->OriginalFileName,
        'server' => $image->FileName,
        'size' => File::size(storage_path() . '/uploads/images/suspects/' . $request->input('id') . '/full_size/' . $image->FileName),
        'path' => storage_path() . '/uploads/images/suspects/' . $request->input('id') . '/full_size/'
    ];
}

return response()->json([
    'images' => $imageAnswer
]);

返回

Not allowed to load local resource: file:///C:/xampp/htdocs/IMS/storage/uploads/images/suspects/2/full_size/file.jpg

现在,如果我的图片位于公共文件夹中,这可能会有效。但出于安全考虑,我必须将其存储在存储文件夹中。我可以在粘贴网址时通过浏览器访问该文件,但不能在javascript中访问。我认为这可能是因为权限。如何从存储文件夹加载文件并将其显示在dropzone上?

我要求将其加载到dropzone而不是图片代码。

2 个答案:

答案 0 :(得分:0)

不允许浏览器从硬盘驱动器加载文件。如果你不想把你的文件放在公共文件夹中这里有一个选项。

$path = storage_path('path/to/your/file.extension');
$data = file_get_contents($path);
$type = pathinfo($path, PATHINFO_EXTENSION);
$base64 = base64_encode($data);

$src = 'data:image/' . $type . ';base64,' . $base64;

return "<img src={$src} />";

我们的想法是获取您文件的内容并编码为base64然后您可以回复您的观点,Laravel可能会为此类流程提供API。

答案 1 :(得分:0)

我认为你可以调用或设置一个{symbolic link}来引导你的{image file}到你的[storage]目录。 参考:http://php.net/manual/en/function.symlink.php

例如:

$sUploadImage = $image->getFilename();
$sStoragePath = storage_path() . '/uploads/images/suspects/' . $request->input('id') . '/full_size/';
$sPublicPath = public_path(). '/uploads/images/suspects/' . $request->input('id') . '/full_size/';
if (is_dir($sPublicPath) !== true) {
    mkdir($sPublicPath, 0755, true); // This would create a new directory (e.g 'public/uploads/images/suspects/{id}/full_size/')
}

// If there's no symlink exists (e.g 'public/uploads/images/suspects/{id}/full_size/{filename.png}', create a new one
if (is_link($sPublicPath . '/' . $sUploadImage) !== true) {
    symlink($sStoragePath . '/' . $sUploadImage, $sPublicPath . '/' . $sUploadImage);
}

通过这种方式,您有一个快捷方式链接&#39;这将把[storage]目录中的图像引用到[public]目录。

然后替换{$ imageAnswer}数组中的{size}和{path}键。

'size' => File::size($sPublicPath . '/' . $sUploadImage),
'path' => $sPublicPath . '/' . $sUploadImage

然后你现在可以在dropzone中使用那些{images},就像@hassan在评论中提到的那样。

希望这有助于您的情况。