我可以使用Laravel Storage和FileSystem类成功上传文件。
我的问题是我想通过其内容唯一地识别该文件。
我在想,当我在服务器上保存文件时,我使用内容的哈希重命名上传的文件。
问题是有没有办法获取文件内容的哈希值。 另一个复杂性是它是一个excel文件。
注意:我尝试使用md5_file来使用文件哈希但是对于xlsx文件,即使我保存文件而不进行sigle更改,md5_file也不一样。
谢谢, ķ
答案 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有时会对我这样做。 This question可能是相关的。我不确定除非你能控制上传,否则你可以在这里做很多事情,在这种情况下你可以在哈希检查之前避免打开它们。