一、实现的功能:
1.多文件上传;2.显示原始文件名,而不是tp5生成的文件名;3.添加自定义文件名后再实现创建时间子目录,以便可以防止文件名相同报错。(项目开发笔记,如有需求仅做参考)
二、多文件上传功能:
有关多文件上传网上有很多实例进行参考,本次使用html5新增的multiple的功能,话不多说,前端页面代码(使用form表单进行传递,采用post方式,也可以使用ajax进行提交;样式使用bootstrap进行设计):
<div class="form-group">
<label class="control-label">附件</label>
<input type="file" name="attachment[]" class="form-control" multiple="multiple">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary" id="submit">发布</button>
</div>
控制台代码(完整代码):
//attachment为数据表的名称、表单的名称,必须一致,返回一个文件对象
$files = Request::file('attachment');
foreach ($files as $file)
{
$name = $file->getInfo()["name"];
//为文件添加时间子目录
$name = date('Ymd').DIRECTORY_SEPARATOR .$name;
//文件信息验证成功后,再上传到指定的文件目录,以public为起始目录
$info = $file->validate([
'size'=>50000000
])->move('attachments',$name);
if ($info){
$demo[] = $info->getSaveName(); //上传成功则赋值
}else {
$this->error($file->getError(),'admin/publicInform'); //上传失败则返回错误信息
}
}
//将数组转化为字符串存储到数据库中
$data['attachment'] = json_encode($demo);
//将数据写到数据表中
if (Inform::create($data)){
$this->success('通知发布成功!','index/news');
}else{
$this->error('通知保存失败!');
}
三、控制台代码说明:foreach是进行多文件上传的,$name = $file->getInfo()[“name”];是取出原来上传的文件名, n a m e = d a t e ( ′ Y m d ′ ) . D I R E C T O R Y S E P A R A T O R . name = date('Ymd').DIRECTORY_SEPARATOR . name=date(′Ymd′).DIRECTORYSEPARATOR.name;语句实现为保留服务器端的文件添加时间子目录, $info = f i l e − > v a l i d a t e ( [ ′ s i z e ′ = > 50000000 ] ) − > m o v e ( ′ a t t a c h m e n t s ′ , file->validate([ 'size'=>50000000 ])->move('attachments', file−>validate([′size′=>50000000])−>move(′attachments′,name);是将文件存储到服务器端并验证大小,还可以验证类型等,具体可以参考tp5开发手册(很详细), d a t a [ ′ a t t a c h m e n t ′ ] = j s o n e n c o d e ( data['attachment'] = json_encode( data[′attachment′]=jsonencode(demo);语句是将数组转化为json字符串存储到数据库中,取出时采用json_decode进行取出转化为数组,Inform是我引用静态代理后实现的,可以采用Db存储到数据库中后使用其他方法。
四、结果如图(服务器文件存储与数据库信息存储结果):
五、总结:写的不是太好,仅供参考!!!