laravel php artisan storage:link 创建storage目录软连接,可以被web访问
为什么我们要创建软连接?
因为项目根目录下的 public 是一个特殊的目录,这个目录下存放可公共访问的资源。
什么是可公共访问呢?就是可以通过`http://域名/文件路径`的形式访问到。
像我们通过laravel上传文件,如果我们把上传的资源文件存储在本地的话,Laravel 默认会放在 storage/app 里面,但是这个目录是不可见的,如果想要能公共访问就必须暴露在项目根目录下的 public 中,这就是创建软链接的原因 。
我们执行php artisan storage:link这个命令后呢,项目中public目录下就会多出来一个storage目录,这个目录就是storage/app/public目录的一个软连接。
简单举例:如果我们的域名是http://www.zhangzhengshan.com
项目的目录结构如下:
storage
—-app
——–public
————avatar.png
public
—-storage
我们通过访问http://www.zhangzhengshan.com/storage/avatar.png就可以访问到storage/app/public/avatar.png这个文件了。
//前台代码如下:
<div class="layui-card-body">
<form class="layui-form" action="{{route('admin.news.store')}}" method="post" enctype="multipart/form-data">
{{csrf_field()}}
<?php
$category = \App\Services\NewsService::category();
?>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">分类</label>
<div class="layui-input-block" style="width: 100%;">
<select name="news[category_id]" lay-verify="required">
<option value="">请选择资讯类型</option>
<?php foreach ($category as $k=>$v){ ?>
<option value="{{$v->id}}" @if(isset($news->category_id) && $news->category_id == $v->id) selected @endif>{{$v->title}}</option>
<?php } ?>
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">标题</label>
<div class="layui-input-block" style="width: 100%;">
@if(isset($news->title))
<input type="text" name="news[title]" value="{{ $news->title }}" lay-verify="required" placeholder="请输入资讯标题" class="layui-input" style="width: 500px;">
@else
<input type="text" name="news[title]" value="" lay-verify="required" placeholder="请输入资讯标题" class="layui-input" style="width: 500px;">
@endif
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">图片</label>
<div class="layui-input-block" style="width: 100%;">
@if(isset($news->picture))
<input type="file" name="pic_file" value="" id="file">
<img src="{{ $news->picture }}">
@else
<input type="file" name="pic_file" id="file">
@endif
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline" style="width: 100%;">
<label class="layui-form-label">简介</label>
<div class="layui-input-block">
@if(isset($news->desc))
<textarea type="text" id="desc" name="news[desc]" rows="10" cols="100">{{ $news->desc }}</textarea>
@else
<textarea type="text" id="desc" name="news[desc]" rows="10" cols="100"></textarea>
@endif
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline" style="width: 80%;">
<label class="layui-form-label">内容</label>
<div class="layui-input-block">
@if(isset($news->content))
<textarea type="text" id="content" name="news[content]" style="display: none;">{{ $news->content }}</textarea>
@else
<textarea type="text" id="content" name="news[content]" style="display: none;"></textarea>
@endif
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-block" style="width: 100%;">
<input type="checkbox" @if(isset($news->status) && $news->status == 1) checked @endif name="news[status]" lay-skin="switch" lay-text="开启|关闭">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button type="submit" class="layui-btn" lay-submit="" lay-filter="formDemo">确 认</button>
<a class="layui-btn" href="{{route('admin.news.index')}}" >返 回</a>
</div>
</div>
@section('script')
<script>
layui.use('layedit', function(){
var layedit = layui.layedit;
layedit.build('content',{
height: 280, //设置编辑器高度
}); //建立编辑器
});
</script>
@endsection
</form>
</div>
//上传图片
public function store(Request $request){
$data = $request->get('news');
$data['status'] = (isset($data['status']) && $data['status'] =='on'?1 : 0);
//不为空
if($request->hasFile('pic_file')){
$file = $request->file('pic_file');
$fileExtension = $file->getClientOriginalExtension();
if(! in_array($fileExtension, ['jpg', 'png','jpeg','gif'])) {
return false;
}
//临时绝对路径
$filePath = $file->getRealPath();
$filename = date('Ymdhis').mt_rand(10,99).'.'.$fileExtension;
Storage::disk('public')->put($filename, file_get_contents($filePath));
$data['picture'] = config('app.url').'/storage/'.$filename;
}
if (News::create($data)){
return redirect()->to(route('admin.news.index'))->with(['status'=>'添加公司成功']);
}
return redirect()->to(route('admin.news.index'))->withErrors('系统错误');
}
//控制台执行php artisan storage:link,把/public/storage指向storage/app/public,这样就可以访问上传到storage/app/public里面的图片了