我能够使用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有时也会对我这样做。这个问题可能有关联。我不确定你在这里能做什么,除非你能控制上传,在这种情况下,你可以避免在哈希检查之前打开它们。