好,我認可個人忠告.php
今天laravel框架編寫一個文件上傳部分.總能找到不正確的路徑.可是,終於攻克.laravel
如下我分享一下本身的學習體會吧.算法
clientwindows
<form method="POST" action="" enctype="multipart/form-data">緩存
<input type="file" name="myfile" />php7
<input type="submit" name="submit" value="Submit" />app
</form>框架
提交到server端.函數
$file = Input::file('myfile');學習
if($file -> isValid()){
//檢驗一下上傳的文件是否有效.
$clientName = $file -> getClientOriginalName();//客戶端文件名..
$tmpName = $file ->getFileName();//緩存在tmp目錄中的文件名稱好比php8933.tmp 這樣的類型的.
$realPath = $file -> getRealPath(); //這個表示的是緩存在tmp目錄下的文件的絕對路徑
//好比個人是:G:\xampp\tmp\php5A69.tmp
//這裏要注意,假設我使用接下來的move方法以後, getRealPath() 就找不到文件的路徑了.因爲文件已經被移走了.
因此這裏道出了文件上傳的原理,將文件上傳的某個暫時文件夾中,而後使用Php的函數將文件移動到指定的文件夾.
$entension = $file -> getClientOriginalExtension(); //上傳文件的後綴.
$mimeTye = file -> getMimeType();//你們對mimeType應該不陌生了. 我獲得的結果是 image/jpeg.
//這裏要注意一點,曾經咱們使用mime_content_type(),在php5.3 以後,開始使用 fileinfo 來獲取文件的mime類型.因此要增長 php_fileinfo的php拓展.windows下是 php_fileinfo.dll,在php.ini文件裏將 extension=php_fileinfo.dll前面的分號去掉就能夠.固然要從新啓動server.
最後咱們使用
$path = $file -> move('storage/uploads');
假設你這樣寫的話,默認是會放置在 咱們 public/storage/uploads/php79DB.tmp
貌似不是咱們但願的,假設咱們但願將其放置在app的storage文件夾下的uploads文件夾中,並且需要更名的話..
$path = $file -> move(app_path().'/storage/uploads',$newName);
這裏app_path()就是app目錄所在的路徑.$newName 可以是你經過某種算法得到的文件的名稱.主要是不能反覆產生衝突就能夠. 比方 $newName = md5(date('ymdhis').$clientName).".".$extension;
利用日期和client文件名稱結合 使用md5 算法加密獲得結果.不要忘記在後面加上文件原始的拓展名.
好吧.開始原本想敲代碼的,現在搞成這幅德行了..
Best Wishes.
}