Laravel存储链接不适用于生产

时间:2018-06-06 21:51:30

标签: php laravel

我正在使用storage_path保存我的图片,并将我的存储文件夹符号设为public_html

php artisan storage:link

在本地一切正常,当我上传图片时,它会上传到存储文件夹中,它的链接会显示在public文件夹中,但由于我转到了实时主机和制作模式,我的图片会上传到存储空间文件夹,但public_html/storage中没有任何内容,我无法将它们放在我的前端。

/config/filesystems.php

'public' => [
  'driver' => 'local',
  'root' => storage_path('app/public/'),
  'url' => env('APP_URL').'/storage',
  'visibility' => 'public',
],

.env

FILESYSTEM_DRIVER=public

controller sample

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename = 'page' . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = storage_path('app/public/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

任何想法?

12 个答案:

答案 0 :(得分:2)

通过public_path

更改storage_path设置
'public' => [
  'driver' => 'local',
  'root' => public_path('app/public_html/'),
  'url' => env('APP_URL').'/storage',
  'visibility' => 'public',
],

if ($request->hasFile('image')) {
  $image = $request->file('image');
  $filename = 'page' . '-' . time() . '.' . $image->getClientOriginalExtension();
  $location = public_path('app/public_html/images/' . $filename);
  Image::make($image)->resize(1200, 600)->save($location);
  if(!empty($page->image)){
    Storage::delete('images/' . $page->image);
  }
  $page->image = $filename;            
}

如果不起作用,您可以尝试:

$path = base_path().'/../public_html/images'; 

答案 1 :(得分:2)

我刚遇到此问题,而这就是我解决该问题的方法,而无需通过SSH进入服务器或运行CronJob:

对于 Laravel 5 + (未经较低版本测试)

您可以在路由/控制器内部使用Artisan::call()方法来执行工匠命令,而无需使用终端。

$exitCode = Artisan::call('storage:link', [] );
echo $exitCode; // 0 exit code for no errors.

答案 2 :(得分:2)

一种解决方案是将文件和图像直接上传到public_html文件夹。 像这样更改 config / filesystems.php

'public' => [
    'driver' => 'local',
    'root' => public_path() . '/../public_html/admin-upload',
    'url' => env('APP_URL').'/admin-upload',
    'visibility' => 'public',
],

答案 3 :(得分:2)

我知道这是一个旧线程,但是我们可以通过在Config / filesystem.php中进行一些更改来更改它

替换

@JsonCreator
public static AnimalType fromString(String key) {
    return displayName == null
            ? null
            : AnimalType.valueOf(key.toUpperCase());
}

使用

'links' => [
        public_path('/storage') => storage_path('app/public'),
    ],

enter image description here

您可以检查此存储库。我已经在其中实现了 https://github.com/ali-chaudhry/Laravel-7-Boilerplate-with-Spatie-uuid-Unishrp-filemanager-integeration

答案 4 :(得分:1)

解决

感谢您的所有帮助,我尝试在我的服务器上运行php artisan storage:link,并且出于安全原因我发现我的服务器已禁用symlink

所以我更改了所有图片上传功能,以便在我的public文件夹而不是storage文件夹中上传图片,现在一切正常。

答案 5 :(得分:1)

从公用目录中删除存储文件夹 然后使用这条路线

Route::get("/storage-link", function () {
    $targetFolder = storage_path("app/public");
    $linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage';
    symlink($targetFolder, $linkFolder);
});

答案 6 :(得分:1)

我为解决这个问题做了什么:

  1. 使用 ssh 进入项目文件夹
  2. 如果公用文件夹不存在,则创建它。如果已经创建,请确保您在开发中创建的存储符号链接已被删除。
  3. php artisan storage:link
  4. 将创建的存储符号链接移动到 public_html 文件夹
  5. 完成。

答案 7 :(得分:0)

从公共目录删除文件夹存储并在Cron Job中运行此命令[一次]

ln -s / home / public_html / storage / app / public / home / dev5 / public_html / public / storage

答案 8 :(得分:0)

您还可以先删除文件夹storage:link,然后在主机中打开终端并命令php artisan storage:link。如果您的托管支持符号链接可以正常工作

答案 9 :(得分:0)

我遇到了同样的问题,为了解决它,我不得不删除已经创建的文件夹的存储,然后我重新启动命令。 PHP工匠存储:链接

答案 10 :(得分:-1)

我看到问题已得到解答,但我想提出另一种我认为很简单的解决方案。 转到路由文件夹your-app-folder/routes/web.php并按如下所示注册新路由

Route::get('/linkstorage', function () {
    Artisan::call('storage:link')
});

然后转到您的网站www.example.com/linkstorage,它将带您到空白页。 而已。将创建存储文件夹。希望对您有所帮助。

答案 11 :(得分:-3)

解决方案: 将您的应用程序上传到实时服务器后。 只要检查一下公共目录中是否有存储文件夹即可。 Check the folder stucture

只需从公共目录中删除存储文件夹。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Socket.io</title>
</head>

<body>
    <h1>Communication avec socket.io !</h1>
    <div id='r'>Connection..</div>


    <script src="jquery.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
       var socket = io.connect('http://localhost:8080');
        socket.on('message', function(message) {
            document.getElementById('r').innerHTML = message;
        })
    </script>
</body>
</html>

然后,从腻子软件访问您的主要Laravel项目文件夹,并实时运行此命令。

请记住配置您的 .env 文件APP_URL = {您的实时服务器IP},然后配置以下命令。

[app/public/storage]

它将在与 APP_URL 关联的公用文件夹中创建一个新的存储链接。