#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 ; }
Он будет создавать разные имена для файла каждый раз, даже если он загружается в одно и то же время