2017-01-11 2 views
3

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

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

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

    } 

Но, название получает изменено на что-то вроде:

php5DEB.php

phpCFEC.php

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

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

+1

Хотя разрешение пользователям переименовать файл является хорошим вариантом, однако рекомендуется добавить уникальный идентификатор имени файла. Допустим, ваше имя файла «image.png» добавляет текущую метку времени, и она станет «image_timestamp.png». Если пользователь снова загрузит файл с помощью «image.png», поскольку временная метка будет отличаться, и, следовательно, если вы будете следовать вышеописанному методу, вы не столкнетесь между именами файлов. –

+0

Используйте хранилище laravel вместо того, чтобы обрабатывать загрузку файлов, как я упоминал в ответе – Gayan

+0

Я изменил свой ответ, как указано ниже, после ввода @ cpburnz. Это полезно. – Gayan

ответ

3

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

В 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 :: случайное (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'); 
} 
0

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

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

Отображается ошибка: FatalErrorException в строке UploadController.php 19: Вызов функции-члена move() по нуле – Rock

-3

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

enctype="multipart/form-data" 
+0

Ваш ответ не соответствует заданному вопросу. –

+0

Не имеет отношения вообще. –

1

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

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

Найти это tutori все полезно. file uploads 101

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

- Edit -

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

Первый драйвер для хранения должен выглядеть в /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 

для создания в вашем /your-app/public/ в simlink, что указывает на /your-app/storage/app/public поэтому вы можете публиковать свои файлы. More info on filesystem - the public disk.

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

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

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – cpburnz

-1

на вершине после имен использования для хранения;

Just do something like this .... 

// читать файлы $ первенствует = $ request-> файл ('файл');

// 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 _' дата ("M_D_Y_h: i_a _") $ excelName;..

Смежные вопросы