【问题标题】:Laravel 5.2 Not allowed to load local resource: from storage folderLaravel 5.2 不允许加载本地资源:从存储文件夹
【发布时间】:2017-03-12 11:55:16
【问题描述】:

我正在尝试从 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

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

我问的是把它加载到dropzone而不是image标签。

【问题讨论】:

  • @hassan 我问的是 dropzone 不只是将它加载到图像标签中。
  • 我认为这是同样的问题,您的浏览器正在尝试从硬盘驱动器加载资源,例如,对于 dropzone,您可能需要从 tmp 目录加载图像。
  • @hassan 我很想知道我应该怎么做。
  • 对不起,我刚醒了关于 dropzone B) 的问题。但是,我认为这会有所帮助,github.com/enyo/dropzone/wiki/…

标签: javascript php laravel-5.2


【解决方案1】:

浏览器不允许从您的硬盘加载文件。如果您不想将文件放在公用文件夹中,我有一个选择。

$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。

【讨论】:

  • 这是否适用于 dropzone,因为 dropzone 有不同的获取文件的方法?
  • @FriencyFernandez 我不确定 dropzone。
【解决方案2】:

我认为您可以调用或设置一个 {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);
}

通过这种方式,您有一个“快捷链接”,可以将图像从 [storage] 目录引用到 [public] 目录。

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

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

然后您现在可以像 @hassan 在 cmets 中提到的那样使用 dropzone 中的那些 {images}。

希望这对您的情况有所帮助。

【讨论】:

  • 这不允许在其他实例中直接访问文件吗?
  • 您指的是哪种实例?当您使用 call {dropzone} 模型处理程序时,您得到了什么输出? github.com/enyo/dropzone/wiki/… // 创建模拟文件: var mockFile = { name: "Filename", size: 12345 }; // 调用默认的 addedfile 事件处理程序 myDropzone.emit(" addedfile", mockFile); // 并且可以选择显示文件的缩略图: // (@eeya: url 将是:/uploads/images/suspects/{id}/full_size/{image_file_name.png} myDropzone.emit("thumbnail", mockFile, "/image/url");
  • 使用符号链接没有风险吗?
  • 这可能取决于您如何设置 Web 服务器的 .htaccess(例如 Apache) 参考:serverfault.com/questions/195570/htaccess-security/… serverfault.com/questions/244592/… 我还不太习惯配置 apache2。我只知道这个的基础知识。
  • 谢谢。我试试看。
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 2018-03-16
  • 2021-09-01
  • 2016-10-08
  • 2016-11-04
  • 2014-12-10
相关资源
最近更新 更多