You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel控制器中用真实名称保存jsPDF生成的PDF文件?

解决jsPDF生成PDF后Laravel保存真实文件名的问题

问题根源

  1. 前端AJAX请求错误地将FormData与单独的name字段包装在对象中传递,导致FormData未被正确解析
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:01:55