Я разрешаю пользователям загружать любые файлы на мою страницу, но может быть столкновение имен файлов. Поэтому я хочу переименовать файл автоматически, так что в любое время, когда любой файл будет загружен, в базе данных и в папке после загрузки, имя файла будет изменено также, когда другой пользователь загрузит тот же файл, переименованный файл будет загружен.
Я пробовал:
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');
}
Используйте этот
$file->move($destinationPath, $fileName);
Вы можете использовать основную функцию php rename(oldname,newName)
http://php.net/manual/en/function.rename.php
Найти этот учебник.
загрузка файлов 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');
. Вы можете использовать любую свою логику и порядок по убыванию.
Вы можете переименовать загруженный файл, как вы хотите. Вы можете использовать метод 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);
правильное использование.
$fileName = Input::get('rename_to');
Input::file('photo')->move($destinationPath, $fileName);
вверху после пространства имен
используйте 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;
Чтобы загрузить файлы с формой, вы должны поместить этот атрибут в свой тег :
enctype="multipart/form-data"