如何在 Laravel 中防止子資料夾中的重複文件
P粉770375450
2023-07-31 16:12:39
<p>我建立了一個新增視圖,可以同時上傳多個檔案。當檔案被上傳時,檔案路徑會顯示為類似 'Drawings/PartNumber/Type/filename.extension' 的格式。我想在 'Drawings' 資料夾中檢查,確保任何檔案都不能與副檔名相同。請問如何實現? </p>
<ol>
<li>Drawings/PartNumber1/Type1/filename1.pdf</li>
<li>Drawings/PartNumber2/Type2/filename1.pdf</li>
<li>Drawings/PartNumber1/Type3/filename1.pdf</li>
<li>Drawings/PartNumber1/filename1.pdf</li>
<li>Drawings/filename1.pdf
never will be accepted.</li>
</ol>
<p>我的函數是:</p>
<pre class="brush:php;toolbar:false;">public function AddNewPart(Request $request)
{
if (array_key_exists('DrawingFile',$data)) {
foreach($request->file('DrawingFile') as $key=>$file)
{
if ($data['fileupload_ID'][$key]==NULL) {
$extension=$file->getClientOriginalExtension();
$file_name2 = $file->getClientOriginalName();
$filepath='Drawings/'.$data['PartNumber'].'/'.$data['Type'][$key].'/'.$file_name2;
$file->move(public_path('Drawings/'.$data['PartNumber'].'/'.$data['Type'][$key].'/'), $file_name2);
$DocumentData2=array('Type'=>$data['Type'][$key],'fcontent'=>$file_name2,'condpartno'=>$data['PartNumber'],'fname'= >$filepath,
'DrawingNo'=>$data['DrawingNo'][$key],'DocumentType'=>$data['Type'][$key]);
DB::table('fileupload')->insert($DocumentData2);
}
}
}
}</pre>
<p><br /></p>
如果您希望防止相同的檔案在不同的子目錄中被多次上傳,您可以利用 Laravel 的檔案系統(Filesystem)並在嘗試上傳檔案之前檢查檔案是否存在。
檔案門面(File facade)提供了一個 exists 方法,您可以使用它來檢查給定路徑中的檔案是否存在。
下面是您可能會修改的方法:
上述程式碼只會在指定目錄中不存在該檔案時才進行上傳。如果檔案已經存在,則會傳回一個帶有訊息 '檔案已存在' 的錯誤回應。
要注意的一點是 getClientOriginalName() 方法的行為。它將傳回來自客戶端機器的檔案的原始名稱,如果來自不同客戶端的檔案具有相同的名稱,可能會導致問題。如果這是一個問題,請考慮在上傳時實作唯一命名約定。
此外,請記住在文件的頂部導入必要的類,並注意處理所有潛在問題,如缺少必填欄位或資料庫插入失敗。