Laravel: автоматическое переименование загруженного файла

Вопрос:

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

if (Input::hasFile('file')){
echo "Uploaded</br>";
$file = Input::file('file');

$file ->move('uploads');
$fileName = Input::get('rename_to');

}

Но имя изменилось на что-то вроде:

php5DEB.php

phpCFEC.php

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

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

Лучший ответ:

Для уникального сохранения имени файла

В 5.3 (лучше для меня, потому что используйте md5_file hashname в Illuminate\Http\UploadedFile):

public function saveFile(Request $request) {
    $file = $request->file('your_input_name')->store('your_path','your_disk');
}

В 5.4 (используйте не уникальную Str:: random (40) hashname в Illuminate\Http\UploadedFile). Я использую этот код для обеспечения уникального имени:

public function saveFile(Request $request) {
    $md5Name = md5_file($request->file('your_input_name')->getRealPath());
    $guessExtension = $request->file('your_input_name')->guessExtension();
    $file = $request->file('your_input_name')->storeAs('your_path', $md5Name.'.'.$guessExtension  ,'your_disk');
}

Ответ №1

Используйте этот

$file->move($destinationPath, $fileName);

Ответ №2

Вы можете использовать основную функцию php rename(oldname,newName) http://php.net/manual/en/function.rename.php

Ответ №3

Найти этот учебник.
загрузка файлов 101

Все, что вам нужно знать о загрузке файлов, есть.

– Изменить –

Я изменил свой ответ, как показано ниже, после ценного ввода из @cpburnz и @Moinuddin Quadri. Спасибо, ребята.

Сначала ваш драйвер хранилища должен выглядеть так: /your-app/config/filesystems.php

'public' => [
'driver' => 'local',
'root' => storage_path('app/public'), // hence /your-app/storage/app/public
'visibility' => 'public',
],

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

В Controller вы делаете следующее.

$file = request()->file('file'); // Get the file from request
$yourModel->create([
'file' => $file->store('my_files', 'public'),
]);

Ваш файл загружается в /your-app/storage/app/public/my_files/, и вы можете получить доступ к загруженному файлу, например

asset('storage/'.$yourModel->image)

Убедитесь, что вы выполняете

php artisan storage:link

чтобы создать simlink в вашем /your-app/public/, который указывает на /your-app/storage/app/public, чтобы вы могли публично публиковать свои файлы. Дополнительная информация о файловой системе – общедоступный диск.

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

Чтобы ответить на вторую часть вашего вопроса, которая должна показывать недавно загруженные файлы, поскольку вы сохраняете ссылку на файл в базе данных, вы можете получить к ней доступ по вашей записи в базе данных и сделать ее ->orderBy('id', 'DESC');. Вы можете использовать любую свою логику и порядок по убыванию.

Ответ №4

Вы можете переименовать загруженный файл, как вы хотите. Вы можете использовать метод move или storeAs с подходящим параметром.

$destinationPath = 'uploads';
$file = $request->file('product_image');
foreach($file as $singleFile){
$original_name = strtolower(trim($singleFile->getClientOriginalName()));
$file_name = time().rand(100,999).$original_name;
// use one of following
// $singleFile->move($destinationPath,$file_name); public folder
// $singleFile->storeAs('product',$file_name);  storage folder
$fileArray[] = $file_name;
}
print_r($fileArray);

Ответ №5

правильное использование.

$fileName = Input::get('rename_to');
Input::file('photo')->move($destinationPath, $fileName);

Ответ №6

вверху после пространства имен
используйте Storage;

    Just do something like this ....

//чтение файлов   $ excel = $request- > file (‘файл’);

// rename file
$excelName = time().$excel->getClientOriginalName();

// rename to anything
$excelName = substr($excelName, strpos($excelName, '.c'));
$excelName = 'Catss_NSE_'.date("M_D_Y_h:i_a_").$excelName;
$excel->move(public_path('equities'),$excelName);

Этот парень собирает только расширение:

 $excelName = substr($excelName, strpos($excelName, '.c'));

Этот парень переименовал его:
$ excelName = ‘Catss_NSE _’. date ( “M_D_Y_h: i_a _” ). $excelName;

Ответ №7

Чтобы загрузить файлы с формой, вы должны поместить этот атрибут в свой тег :

enctype="multipart/form-data"

Оцените статью
TechArks.Ru
Добавить комментарий