无法显示数据库中的图像 - Laravel

时间:2018-03-07 11:10:12

标签: php laravel

我与产品和图片有关系。用户可以上传产品的许多图像,因此我有一个产品表和product_images表。

当我尝试从数据库中获取图像时,我的视图中没有可用的图像。但我能够保存到我的数据库中的路径属性。

为什么会发生这种情况?

product_images

id

product_id

path

产品

public function images()
{
   return $this->hasMany(Image::class);
}

图片

 public function products()
 {
    return $this->belongsTo(Product::class);
 }

控制器

     public function index()
     {   
         $products = Product::where('type', 'BASIC')->inRandomOrder()->take(6)->get();
         return view('home.index',compact('products');   
     }

 $product_image = Product::create($request->all());

        if ($request->hasFile('image'))
         {
            $request->file('image')->store('uploads/catalog/images');

            // ensure every image has a different name
            $file_name = $request->file('image')->hashName();

            // save new image $file_name to database
            $product_image->images()->update(['image' => $file_name]);
        }

查看

@foreach($products as $product)
    @foreach($product->image as $img)
      <div class="product-item men">
          <div class="product discount product_filter">
              <div class="product_image">
                <a  href="{{ route('product.view', $product->slug)}}"><img src="{{$img}}" alt=""></a>
              </div>
              <!-- <div class="favorite favorite_left"></div> -->
              <!-- <div class="product_bubble product_bubble_right product_bubble_red d-flex flex-column align-items-center"><span>offer</span></div> -->
              <div class="product_info">
                <h6 class="product_name"><a href="{{ route('product.view', $product->slug)}}">{{$product->name}}</a></h6>
              </div>
            </div>
        </div>
    @endforeach
@endforeach

DD($张图片)

ProductImage {#523 ▼
  #fillable: array:3 [▼
    0 => "product_id"
    1 => "path"
    2 => "is_main_image"
  ]
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:6 [▼
    "id" => 1
    "product_id" => 1
    "path" => "/Users/emmnock/laravel-ecommerce/public/uploads/catalog/ZsT4VwjWS5tLvIl0AKV6sAOxHFrwzwII5FMVUVkP.png"
    "is_main_image" => null
    "created_at" => "2018-03-07 10:04:34"
    "updated_at" => "2018-03-07 10:04:34"
  ]
  #original: array:6 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #guarded: array:1 [▶]
}

3 个答案:

答案 0 :(得分:0)

如果您的图片位于new TextField( textAlign: TextAlign.center, decoration: new InputDecoration( hintText: '1', border: new OutlineInputBorder( borderRadius: const BorderRadius.all( const Radius.circular(0.0), ), borderSide: new BorderSide( color: Colors.black, width: 1.0, ), ), ), ) 文件夹中,请使用public

这是一个例子

asset()

也在你的<img src="{{ asset(str_replace(app_path(),'',$img->path))}}" alt=""> 中 使用下面给出的代码

foreach

如果是存储文件夹,则将图像移动到存储,然后使用asset()或创建符号链接

使用 @foreach($product->images as $img)

希望这有帮助

答案 1 :(得分:0)

您无法使用img对象来回应它。 Image必须包含urlpath等属性,因此您只能输出它们。看起来你在path属性中存储完整路径(为什么?)。

$url = str_replace(public_path(), "", $img->path);
<img src="{{ $url }}" alt="">

如果您将文件名存储为图像属性,那么请获取URL。

<img src="{{ Storage::url($img->path_to_file) }}" alt="">

答案 2 :(得分:0)

您的问题是如何在数据库中存储图像。

$request->file('image')->store('uploads/catalog/images');
// ensure every image has a different name
$file_name = $request->file('image')->hashName();
// save new image $file_name to database
$product_image->images()->update(['image' => $file_name]);

您正在使用store()保存文件,然后使用hashName()生成了一个新文件名,这与存储在'uploads/catalog/images'中的图像文件没有任何关系

正确的方法是获取store()方法返回的存储图像的完整路径,并将其保存在数据库中。

$image_path = $request->file('image')->store('uploads/catalog/images');
$product_image->images()->update(['image' => $image_path]);