目前php的各大常用框架都爲我們直接封裝好了文件上傳的相關代碼,不用再勞心勞力的自己寫,使用起來也大同小異,省心不少
一 準備表單頁面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上傳測試</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-10">
<form class="form-horizontal 8" role="form" action="/admin/upload/uploadImage" method="post" name="article" enctype="multipart/form-data">
<div class="form-group">
<label for="title" class="col-md-2 control-label">文章標題</label>
<div class="col-md-8">
<input type="text" class="form-control" id="title" name="title" placeholder="請輸入文章標題">
{{csrf_field()}}
</div>
</div>
<div class="form-group">
<label for="file" class="col-md-2 control-label">附件</label>
<div class="col-md-8">
<input type="file" class="form-control" id="file" name="file"/>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">新增</button>
<button type="reset" class="btn btn-default">取消</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
使用laravel要注意表單的跨域問題,在表單裏寫上{{csrf_field}} ,查看頁面源碼這實際上就是一個隱藏域,表單會帶上_token;還需注意enctype不要遺漏或者寫錯,且表單提交方式爲post
二 文件上傳代碼
無論框架如何變化文件上傳也就是判斷文件是否存在、是否有效、類型是否正確、轉存文件這幾個步驟,直接上代碼
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UploadController extends Controller
{
public function toUpload(){
return view("admin.upload.uploadImage");
}
/**文件上傳操作方法
* @param Request $request
*/
public function uploadImage(Request $request){
if($request->hasFile('file')&&$request->file('file')->isValid()){
$file=$request->file('file');
$allowed_extensions = ["png", "jpg", "gif"];
if (!in_array($file->getClientOriginalExtension(), $allowed_extensions)) {
dd('只能上傳png,jpg和gif格式的圖片.');
}else{
$destinationPath = 'storage/uploads/'; //public 文件夾下面建 storage/uploads 文件夾
$extension = $file->getClientOriginalExtension();
$fileName=md5(time().rand(1,1000)).'.'.$extension;
$file->move($destinationPath,$fileName);
$filePath = asset($destinationPath.$fileName);
dd("文件路徑:".asset($destinationPath.$fileName));
}
}else{
dd('圖片上傳失敗請重試.');
}
}
}
其中使用了助手函數asset,該函數返回一個網絡URL地址,爲了演示方便文件直接存到public/storage/uploads下,實際開發建議把上傳的文件和項目分開,使用nginx等靜態資源的方式讀取和展示