php - 如何在视图中渲染上传的图像?
问题描述
当被问到时,我正在尝试获取要上传和渲染的图像。
我已经成功地在我的本地主机上上传图像,但是一旦我将代码推送到伪造服务器,它就会中断。
图片已上传,但这是我在创建帖子后看到的内容......见下文。
我不知道如何解决这个问题。
有没有人对如何解决这个问题有任何意见或建议?
我做错了什么?
后控制器
<?php
namespace App\Http\Controllers;
use App\Post;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
class PostController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$posts = Post::all();
return view('post.index', compact('posts'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$post = new Post(); // What is this?
return view('post.create', compact ('post'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->validate([
'title' => 'required',
'body' => 'required',
]);
$post = Post::create([
'user_id' => Auth::id(),
'title' => $request->title,
'body' => $request->body
]);
$this->storeImage($post);
return redirect('/posts');
}
/**
* Display the specified resource.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function show(Post $post)
{
return view('post.show', compact('post'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function edit(Post $post)
{
return view('post.edit', compact('post'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Post $post)
{
$this->validatedRequest();
$post->update($request->except('image'));
$this->storeImage($post);
return redirect('/posts');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function destroy(Post $post)
{
$post->delete();
return redirect('/posts');
}
private function validatedRequest()
{
return request()->validate([
'title' => 'required',
'body' => 'required',
'image' => 'sometimes|file|image|max:5000',
]);
}
private function storeImage($post)
{
if (request()->has('image')) {
$filename = Str::random(14).'.'.request()->image->getClientOriginalExtension();
$image = Image::make(request()->image)->fit(300, 300, null, 'top-left')->encode();
Storage::disk('public')->put("uploads/{$filename}", (string) $image);
$post->update([
'image' => "uploads/{$filename}"
]);
}
}
}
表单(show.blade.php)
@if($post->image)
<div class="row">
<div class="col-12">
<img src="{{ asset('storage/uploads/' . $post->image) }}" alt=""
class="img-thumbnail">
</div>
</div>
@endif
解决方案
Storage
可以使用相同的 Storage 类访问上传和存储的文件。尝试
<img src="{{ Storage::disk('public')->url('/uploads/' . $post->image) }}" alt=""
class="img-thumbnail">
asset()
用于访问文件/public
推荐阅读
- swift - @ObservedObject 更改未在异步操作后反映
- java - 在其他类控制器中使用另一个类存储库是正确的方式或使用 RestTemplate 类调用 api 是正确的方式
- javascript - react-native ,客户平面列表选择器,在选择时返回以前的值
- php - 使用 curl 在 postfields 中上传带有文件 @ 的 POST 数据
- node.js - Nodejs ssl3_get_record 版本号错误
- javascript - 为什么简单的 javascript 导入不起作用?
- python - 获取模块的导入名称
- javascript - 在 VueJS 中动态添加选择字段和验证
- algorithm - 给定一个公式,求解一个未知变量
- javascript - 在状态更改时更改 TileLayer 的瓦片