如何在Laravel控制器中用真实名称保存jsPDF生成的PDF文件?
解决jsPDF生成PDF后Laravel保存真实文件名的问题
问题根源
- 前端AJAX请求错误地将
FormData与单独的name字段包装在对象中传递,导致FormData未被正确解析 - jsPDF生成的Blob对象默认文件名为
blob,后端通过getClientOriginalName()只能获取到这个默认值
前端代码修改
将原始文件名追加到FormData中,直接传递FormData对象而非包装后的对象:
var input = document.getElementById('fileUpload').files[0].name; var file = doc.output('blob'); var formData = new FormData(); // 追加文件时指定原始文件名,同时单独传递原始名称字段备用 formData.append('file', file, input); formData.append('original_name', input); $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $.ajax({ method: 'POST', url:'/saveEditorFiles', data: formData, // 直接传递FormData对象 processData: false, contentType: false, success: function(data){console.log(data)}, error: function(data){console.log(data)} });
Laravel控制器代码修改
获取前端传递的原始文件名,替换默认的Blob文件名:
public function storeEditorFiles(Request $request) { $validatedData = $request->validate([ 'file' => 'required|mimes:pdf', 'original_name' => 'required|string', ]); $file = $request->file('file'); $originalName = $request->input('original_name'); // 确保文件名以.pdf结尾,兼容原始文件名无后缀的情况 if (!str_ends_with(strtolower($originalName), '.pdf')) { $originalName .= '.pdf'; } $uniqueName = bin2hex(random_bytes(3)) . '.pdf'; $file->move(public_path('TempFiles/'), $uniqueName); $save = new TempFile; $save->filename = $originalName; // 使用前端传递的真实文件名 $save->user_id = Auth::user()->id; $save->UniqueFileName = $uniqueName; $save->save(); $response = [ 'name' => $originalName, 'file' => $uniqueName, ]; return response()->json(['success' => $response]); }
内容的提问来源于stack exchange,提问作者Abbas Mastan
相关产品推荐
相关产品推荐

