Как предотвратить загрузку одного и того же файла в laravel

#php #laravel #model-view-controller #file-upload #multiple-file-upload

Вопрос:

Я новичок в ларавеле. Я пытаюсь загрузить несколько файлов, но когда я пытаюсь загрузить одни и те же имена файлов одновременно, происходит сбой. как предотвратить загрузку одинаковых имен изображений.

То, что я пробовал, это:

Html-код:

 lt;form method="POST" action="/listingSave" enctype="multipart/form-data" class="sellingFormSave" id="sellingFormSave" onsubmit="validate();"gt;  lt;div class="row"gt;  lt;div class="col-12 section_title-js"gt;  lt;h3gt;lt;/h3gt;  lt;/divgt;  lt;div class="form-group col-md-12"gt;  lt;input id="demo" type="file" name="files" accept=".jpg, .png, image/jpeg, image/png" multiplegt;   lt;/divgt;  lt;/divgt;  lt;button type="submit" class="btn" id="submit"gt;  Save  lt;/buttongt; lt;/formgt;  

Controller.php

 public function listingSave(Request $request) {  if(array_key_exists('image', $request-gt;all())){    $imageName = $request-gt;imageName;    $image = $request-gt;image;  foreach ($image as $key =gt; $value) {   $image_name = date('mdYhis').'_'.$imageName[$key];     $imgdata = base64_decode($value);  $myOutput = public_path().'/app/default/files-module/local/images/'.$image_name;  $ifp = fopen( $myOutput, 'wb' );   fwrite( $ifp, $imgdata );  fclose( $ifp );   $imageInfo = getimagesize($myOutput);  $files = FileModel::updateOrCreate(['name'=gt;$image_name],[  // 'sort_order'=gt;$truckian-gt;id $key,  'sort_order'=gt;0 $key,  'created_at'=gt;date('Y-m-d H:i:s'),  'updated_at'=gt;date('Y-m-d H:i:s'),  // 'created_by_id'=gt;Auth::user()-gt;id,  'created_by_id'=gt;0,  'disk_id'=gt;1,  'folder_id'=gt;1,  'extension'=gt;str_replace('image/', '', $imageInfo['mime']),  'size'=gt;$imageInfo[0]*$imageInfo[1],  'mime_type'=gt;$imageInfo['mime'],  "entry_type" =gt; "AnomalyStreamsPlatformModelFilesFilesImagesEntryModel",  "height" =gt; $imageInfo[1],  "width" =gt; $imageInfo[0],  ]);  // DB::table('truckian_products_image')-gt;insert(['entry_id'=gt;$truckian-gt;id,'file_id'=gt;$files-gt;id,'sort_order'=gt;$key 1]);  DB::table('truckian_products_image')-gt;insert(['entry_id'=gt;$p_id,'file_id'=gt;$files-gt;id,'sort_order'=gt;$key 1]);  }  foreach($available as $key =gt; $value)  DB::insert('insert into default_truckian_mileage_gap(mileage_gap,number_of_products,truck_id)values (?, ?, ?)',[$key,$value,$p_id]);  }   }  

Всякий раз, когда я выполняю одни и те же имена файлов, происходит сбой. Как это исправить.

Комментарии:

1. Вы получаете какие-либо ошибки?

2. @Dula Да, я становлюсь таким . SQLSTATE[23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись ’40-8897′ для ключа ‘c72333b5ba020bf52db5233c89a40c13’ (SQL: вставка в default_truckian_products_image ( entry_id , file_id , sort_order ) значения (40, 8897, 2))

3. Я думаю, что ошибка возникает в том месте, где вы пытаетесь вставить данные в default_truckian_products_image таблицу.

4. @Dula Нет, в нем нет ошибки при загрузке уникальных имен, но когда я пытаюсь загрузить те же изображения, возникает эта ошибка.

5. в вашей БД могут быть добавлены ограничения для идентификатора и имени файла. Вам следует удалить его из схемы таблицы или попытаться добавить какое-либо случайное имя к имени файла

Ответ №1:

Попробуйте использовать переменную инкрементора, как показано ниже, при определении имени файла в цикле foreach

 $i = 0; foreach ($image as $key =gt; $value) {   $image_name = date('mdYhis').'_'.$i.'_'.$imageName[$key];  //other code  $i  ; }  

Он будет создавать разные имена для файла каждый раз, даже если он загружается в одно и то же время