2017-03-12 107 views
0

我试图从存储文件夹中预加载图像到dropzone中。这是我有:Laravel 5.2不允许加载本地资源:从存储文件夹

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而不是图像标记。

+0

可能的重复[不允许使用Laravel加载本地资源](http://stackoverflow.com/questions/37415159/not-allowed-to-load-local-resource-with-laravel) – hassan

+0

@hassan I' m询问dropzone不只是将它加载到图像标签中。 –

+0

这是我认为的同样的问题,您的浏览器试图从硬盘加载资源,对于您可能需要从tmp目录加载图像的dropzone。 – hassan

回答

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。

+0

这将工作dropzone为dropzone有一个获取文件的不同方法? –

+0

@FriencyFernandez我不确定dropzone。 –

0

我认为你可以调用或设置一个将你的{image file}引用到你的[storage]目录的{symbolic link}。 参考: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); 
} 

通过这种方式,你有一个“快捷链接”,将参照图像从[存储]目录到[公用]目录。

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

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

然后,您现在可以在评论中提到@hassan中提到的那些{images}。

希望这有助于你的情况。

+0

这将不允许在其他情况下直接访问文件吗? –

+0

你指的是什么样的实例? 当您使用呼叫{dropzone}样机处理程序时,您获得了什么输出? https://github.com/enyo/dropzone/wiki/FAQ#how-to-show-files-already-stored-on-server //创建模拟文件: var mockFile = {name:“Filename” ,size:12345}; //调用默认的addedfile事件处理程序 myDropzone.emit(“addedfile”,mockFile); //可选择显示文件的缩略图: //(@eeya:网址将为:/uploads/images/suspects/{id}/full_size/{image_file_name.png} myDropzone.emit(“thumbnail” ,mockFile,“/ image/url”); – eeya

+0

使用符号链接没有风险吗? –

相关问题