Laravel:自动重命名上传的文件

时间:2017-01-11 10:26:02

标签: laravel

我允许用户在我的页面上传任何类型的文件,但文件名可能会有冲突。所以,我想自动重命名文件,以便任何时候上传任何文件,在数据库和上传后的文件夹中,当其他用户下载同一文件时,文件名也会被更改,重命名的文件将被下载。 我试过了:

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

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

    }

但是,名称改为:

  

php5DEB.php

     

phpCFEC.php

如何以相同的类型和格式维护文件并更改其名称?

我还想知道如何在页面上显示最近上传的文件并让其他用户下载?

8 个答案:

答案 0 :(得分:7)

使用此

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

答案 1 :(得分:6)

对于唯一文件名称保存

在5.3中(最适合我,因为在Illuminate \ Http \ UploadedFile中使用md5_file hashname):

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

在5.4中(在Illuminate \ Http \ UploadedFile中使用不唯一的Str :: random(40)hashname)。我使用此代码来确保唯一名称:

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');
}

答案 2 :(得分:1)

您可以使用php核心功能rename(oldname,newName) http://php.net/manual/en/function.rename.php

答案 3 :(得分:0)

查找本教程很有帮助。 file uploads 101

您需要了解有关文件上传的所有信息。

- 编辑 -

在@cpburnz和@Moinuddin Quadri的宝贵意见后,我修改了我的答案如下。谢谢你们。

首先,您的存储驱动程序在$Server = 'theServer' $database = 'theDatabase' $Connection = New-Object System.Data.SQLClient.SQLConnection $Connection.ConnectionString = "server=$($Server);database=$($Database);trusted_connection=true;" $Connection.Open() $Command = New-Object System.Data.SQLClient.SQLCommand $Command.Connection = $Connection $Command.CommandText = 'SELECT TOP 5 * FROM yourTable ORDER BY 1 DESC' $Reader = $Command.ExecuteReader() $Datatable = New-Object System.Data.DataTable $Datatable.Load($Reader) $Datatable | Export-Csv report.csv -NoTypeInformation $Connection.Close()

中应如下所示
/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/,以便您可以公开访问自己的文件。 More info on filesystem - the public disk.

通过这种方法,您可以保留与上传文件名相同的文件名。最棒的是/your-app/storage/app/public为文件生成一个唯一的名称,因此可能没有重复项。

要回答显示最近上传文件的问题的第二部分,当您在数据库中保留文件的引用时,可以通过数据库记录访问它们并将其设为Laravel。你可以使用你的逻辑,并按降序排序。

答案 4 :(得分:-1)

正确使用。

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

答案 5 :(得分:-1)

在命名空间后面的顶部 使用存储;

    Just do something like this ....

//读取文件     $ excel = $ request-&gt; file('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;

答案 6 :(得分:-1)

您可以根据需要重命名上传的文件。您可以使用带有适当参数的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);

答案 7 :(得分:-3)

对于带有表单的上传文件,您必须将此属性放在 标记中:

enctype="multipart/form-data"