首页 > 解决方案 > 我从 Postman 上传到 Laravel API 的图像未保存在文件夹中

问题描述

尝试从 Postman 上传图像时,我发送的图像未保存在 Heroku 上的 API 文件夹中。但它存储在某个地方,因为当我使用asset()并打开该链接时,它会正确显示图像。

该路线用于创建产品,图像与之对应:

路线:

Route::post('product/new','ProductController@store');

在我的控制器中:

    $product = new Product;
    $product->name = $request->input('name');
        //Other staff

    if($request->file('image')){

    $path = Storage::disk('public')->put('uploads/images/products',$request->file('image'));
   // $product->image = $path;
    $product->image = asset($path);
}

邮递员配置:

在此处输入图像描述

我已经尝试使用x-www-form-urlencoded、 内容类型multipart/form-data和没有任何内容类型来配置内容类型标头,但它们都不起作用。

我得到的结果是:

{
"id": 1,
"name": "test1",
//staff
"image": "http://{{my_API_domain}}/uploads/images/products/Mz9liaazzCOTwt8CdEWK0My6w3l2GWzR1ERDncCV.png",
}

如果我从浏览器进入http://{{my_API_domain}}/uploads/images/products/Mz9liaazzCOTwt8CdEWK0My6w3l2GWzR1ERDncCV.png,该链接会很好地显示图像,但如果我去那里检查:public/uploads/images/products/ 没有保存的图像,不知道这些图像存储在哪里。

另外,我确实运行php artisan storage:link了并且符号链接文件夹存储在 中创建得很好public/,但是只有在.gitignore里面,我 config/filesystem.php'public' => [ 'root' => storage_path('app/public'),]'public' => [ 'root' => public_path(),]

我的文件结构:

在此处输入图像描述

标签: phplaravelapiherokupostman

解决方案


我不确定您的文件存储在哪里,但更大的问题是您首先将文件保存到本地文件系统。即使您弄清楚文件的去向,这也不会按预期工作。

Heroku 的文件系统是短暂的。下次重新启动测功机时,您对其所做的任何更改都将丢失。这种情况经常发生(至少每天一次)。Heroku建议将上传的文件存储在 Amazon S3 等第三方服务上。

幸运的是,Laravel 开箱即用地支持这一点

  • 添加league/flysystem-aws-s3-v3 ~1.0到您的依赖项
  • 创建 S3 存储桶
  • 配置 Laravel 以使用存储桶config/filesystems.php

您无需对上传代码进行任何更改。文件现在应该会自动保存到您的 S3 存储桶中,让它们在 dyno 循环和新部署中存活下来。


推荐阅读