我正在编写一个 http 文件上传测试并在运行测试时收到应用程序/空错误
我的测试:
public function testUploadContract() {
$user = User::where('id', '=', $this->companyId)->first();
$token = JWTAuth::fromUser($user);
Storage::fake('files');
$file = UploadedFile::fake()->create('file.pdf', 100, ['Content-Type' => 'application/pdf']);
$response = $this->withHeaders(['Authorization' => "Bearer $token", 'Content-Type' => 'application/pdf'])->withoutExceptionHandling()->post('/api/v2/company/documents/upload', ['file' => $file]);
$response->dump();
$response->assertStatus(200);
}
我的控制器:
public function upload(Request $request)
{
// dd($request);
if ($request->hasFile('file') == false) {
// dump($request->file());
return response()
->json([
'title' => 'Ошибка',
'message' => 'Не передан файл с реестром!'
], 400, [], JSON_UNESCAPED_UNICODE || JSON_UNESCAPED_SLASHES);
}
$validMimeTypes = [
'application/pdf',
];
$mimeType = mime_content_type($request->file->getPathname());
if (in_array($mimeType, $validMimeTypes) == false) {
return response()
->json([
'title' => 'Ошибка',
'message' => 'Плохой тип файла (' . $mimeType . ')'
], 400, [], JSON_UNESCAPED_UNICODE || JSON_UNESCAPED_SLASHES);
}
$path = Storage::disk('public')->putFile('temp', $request->file('file'));
$url = Storage::disk('public')->url($path);
Log::channel('debug')->debug("FILE IS $url");
return response()
->json([
'title' => 'Файл загружен',
'message' => 'Файл успешно загружен',
'path' => $path,
'preview' => Storage::disk('public')->url($path)
], 200, [], JSON_UNESCAPED_UNICODE || JSON_UNESCAPED_SLASHES);
}
当我按预期从客户端下载文件时,一切都很好,在测试中这是输出:


请帮忙,我真的不知道该怎么办

该测试使用以下结构:
让我们来看看它的作用
create():事实证明,mime 类型被简单地设置为 object 的一个属性
UploadedFile,而文件的内容是空的。与修补匠检查
php artisan tinker:在控制器中,mime 类型由内容(为空)确定:
因此
application/x-empty。怎么修?
您需要准备一个真正的 pdf 文件,并使用
createWithContent(). 通过 生成假图像时image(),正是这样做的。让我们通过修补程序再次检查:
最好将控制器中的类型定义固定为
$request->file->getMimeType().在这里,以及在
mime_content_type()真正的按内容定义文件类型。如果你看一下排序,它是使用finfo()的,或者是一个 shell 调用file -b --mime——有两种实现。