Laravel文件上传和File_hash作为名称

时间:2015-11-02 11:27:06

标签: file laravel hash

我可以使用Laravel Storage和FileSystem类成功上传文件。

我的问题是我想通过其内容唯一地识别该文件。

我在想,当我在服务器上保存文件时,我使用内容的哈希重命名上传的文件。

问题是有没有办法获取文件内容的哈希值。 另一个复杂性是它是一个excel文件。

注意:我尝试使用md5_file来使用文件哈希但是对于xlsx文件,即使我保存文件而不进行sigle更改,md5_file也不一样。

谢谢, ķ

1 个答案:

答案 0 :(得分:2)

注意:从Laravel 5.4开始,hashName()函数不再根据文件的内容哈希生成文件名。要完成此操作,您需要手动使用md5_file()

哈希答案

Laravel在名为hashName()的文件上传器上有一个方法,根据API docs生成" 文件的文件名,即内容的MD5哈希值&#34 ;.我最近在一个项目中使用它来完成你正在尝试使用它和md5_file()做的事情。以下是我如何完成它的一个例子:

视图

<form method="POST" action="/controller" files="true" enctype="multipart/form-data">
    {!! csrf_field() !!}
    <input type="file" id="file-list" name="file-list[]" multiple="true" />
    <button type="submit">Upload Files</button>
</form>

控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Image;
use App\Filename;
use Storage;

class ImageController extends Controller
{
    /**
     * Store an uploaded file.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $disk = Storage::disk('images');

        foreach ($request->file('file-list') as $file) {

            $filename = Filename::first();

            $disk->putFile('', $file);

            Image::create([
                'filename' => $filename->name,
                'title' => $file->getClientOriginalName(),
                'extension' => $file->guessClientExtension(),
                'size' => $file->getClientSize(),
                'mime' => $file->getClientMimeType(),
                'hash' => md5_file($file->getRealPath()),
            ]);

            $filename->delete();
        }
    }
}

Excel问题

Excel有时会对我这样做。 This question可能是相关的。我不确定除非你能控制上传,否则你可以在这里做很多事情,在这种情况下你可以在哈希检查之前避免打开它们。