Laravel File Upload和File_hash作为名称



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

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

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

问题是有没有一种方法可以获得文件内容的散列。另一个复杂性是它是一个excel文件。

注意:我尝试了md5_file来使用文件哈希,但对于xlsx文件,即使我保存了文件而没有进行任何标记更改,md5_file也不一样。

谢谢,K

注意:自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>

控制器

<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppHttpRequests;
use AppImage;
use AppFilename;
use Storage;
class ImageController extends Controller
{
    /**
     * Store an uploaded file.
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    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有时也会对我这样做。这个问题可能有关联。我不确定你在这里能做什么,除非你能控制上传,在这种情况下,你可以避免在哈希检查之前打开它们。

最新更新