我能够使用 Laravel Storage 和 FileSystem 类成功上传文件。
我的问题是我想通过其内容唯一地标识文件。
我想当我将文件保存在服务器上时,我用内容的哈希重命名上传的文件。
问题是有没有办法获取文件内容的哈希值。
另一个复杂性是它是一个 excel 文件。
注意:我尝试使用 md5_file 来使用文件哈希,但是对于 xlsx 文件,即使我保存文件而不进行单一更改,md5_file 也不相同。
谢谢,
钾
最佳答案
注意:从 Laravel 5.4 开始,hashName()
函数不再根据文件的内容哈希生成文件名。为此,您需要使用 md5_file()
手动。
哈希答案
Laravel 在文件上传器上有一个名为 hashName()
的方法根据 API docs生成“文件的文件名,它是内容的 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>
Controller
<?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可能是相关的。我不确定您可以在这里做很多事情,除非您可以控制上传,在这种情况下,您可以避免在哈希检查之前打开它们。
关于file - Laravel 文件上传和 File_hash 作为名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33476525/