Laravel 文件上传和 File_hash 作为名称

kar*_*dra 4 hash file laravel

我能够使用 Laravel Storage 和 FileSystem 类成功上传文件。

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

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

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

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

谢谢,K

Jos*_*ain 5

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


哈希答案

Laravel 在文件上传器上有一个方法,称为hashName()根据API 文档生成“文件的文件名,即内容的 MD5 哈希值”。我最近在一个项目中使用它来完成您尝试使用它和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>
Run Code Online (Sandbox Code Playgroud)

控制器

<?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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Excel 问题

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

  • 查找“hashName()”方法的源代码,如果我没有记错的话,它不会对内容进行此类 md5 处理。它只是返回“Str::random(40)”作为哈希部分。 (3认同)