0

0

使用Krajee文件输入、AJAX和Laravel实现文件与表单数据上传教程

霞舞

霞舞

发布时间:2025-12-03 14:15:28

|

579人浏览过

|

来源于php中文网

原创

使用krajee文件输入、ajax和laravel实现文件与表单数据上传教程

本教程旨在解决在Laravel应用中,结合Krajee文件输入插件、AJAX和jQuery,通过表单提交而非插件自带上传按钮,实现文本输入与文件(如PDF)同时上传的常见问题。文章将详细阐述前端HTML、JavaScript配置及后端Laravel控制器中如何正确处理FormData和文件请求,确保数据完整送达并有效处理。

在现代Web开发中,文件上传是常见的需求,而结合文本表单数据一同提交则更为普遍。当使用像Krajee文件输入这样的强大前端插件时,开发者有时会遇到如何将其与自定义AJAX表单提交逻辑融合的挑战。本文将提供一个端到端的解决方案,指导您如何在Laravel项目中,利用jQuery和AJAX,通过标准的表单提交按钮,将包含文件和文本的表单数据安全高效地发送到后端控制器。

1. 理解核心挑战与解决方案

核心挑战在于确保浏览器将文件和所有表单字段打包成一个请求发送,并且Laravel能够正确识别并处理这些数据。

  • 前端(JavaScript): 关键在于使用FormData对象。FormData能够模拟HTML表单,自动处理enctype="multipart/form-data"类型的数据,包括文件。当通过AJAX发送FormData时,必须将processData和contentType设置为false,以阻止jQuery对数据进行处理和设置不正确的Content-Type头部。
  • Krajee文件输入插件: 虽然Krajee提供了自己的AJAX上传功能,但当我们的目标是将其集成到整个表单的提交流程中时,我们需要禁用其内部的上传机制,仅将其用作美化和文件选择的工具。
  • 后端(Laravel): Laravel的Request对象提供了专门的方法来访问上传的文件,即$request->file('input_name')。直接使用$request->all()将不会包含文件对象,因为它只返回非文件输入的数据。

2. 构建HTML表单结构

首先,我们需要一个包含文本输入框和Krajee文件输入字段的HTML表单。确保表单设置了enctype="multipart/form-data",这是文件上传的必要条件。同时,为了Laravel的安全机制,别忘了包含CSRF令牌。

<form method="POST" id="upload_form" enctype="multipart/form-data">
    <!-- CSRF 令牌,Laravel 会自动生成一个隐藏的 input 字段 -->
    @csrf 

    <label for="cliente_titulo">标题:</label>
    <input id="cliente_titulo" type="text" class="form-control" name="cliente_titulo" required>

    <label for="cliente_data">日期:</label>
    <input id="cliente_data" type='text' class="form-control" name="cliente_data" autocomplete="off" required>

    <label for="cliente_cliente">客户:</label>
    <input id="cliente_cliente" type='text' name="cliente_cliente" class="form-control" autocomplete="off" required>

    <label for="cliente_condominio">公寓:</label>
    <input id="cliente_condominio" type="text" class="form-control" name="cliente_condominio" required>

    <label for="cliente_pdf">上传PDF文件:</label>
    <!-- Krajee 文件输入字段,name 属性用于后端获取文件 -->
    <input id="cliente_pdf" name="pdf_file" type="file" class="file-loading" 
           data-allowed-file-extensions='["pdf"]' required>

    <button id="confirm-create" type="submit" class="btn btn-success">
        <strong>创建</strong><span class="glyphicon glyphicon-ok"></span>
    </button>                 
</form>

注意:

  • name="pdf_file" 是文件输入字段的关键属性,后端将通过此名称获取文件。
  • @csrf 是Laravel Blade指令,会自动生成一个名为_token的隐藏输入字段,用于CSRF保护。

3. 配置Krajee文件输入插件

为了让Krajee插件与我们的自定义AJAX提交逻辑协同工作,我们需要对其进行初始化,但要禁用其自带的上传功能。

$(document).ready(function() {
    $("#cliente_pdf").fileinput({
        language: "zh", // 设置语言,根据需要调整
        allowedFileExtensions: ['pdf'], // 允许上传的文件类型
        maxFileCount: 1, // 最大文件数量
        showUpload: false, // 禁用Krajee自带的上传按钮
        showRemove: true, // 显示移除按钮
        showCancel: false, // 禁用取消按钮
        purifyHtml: true, // 清理HTML,提高安全性
        // 以下是关键:移除或不设置 Krajee 的 uploadUrl 和 uploadAsync
        // uploadUrl: "{{ url('create') }}", // 注释掉此行或确保不设置
        // uploadAsync: true, // 注释掉此行或确保不设置
        fileActionSettings: {
            showUpload: false, // 在文件预览区禁用上传按钮
        },
        // 如果需要额外数据,通过FormData统一添加,而不是uploadExtraData
        // uploadExtraData: function() { /* ... */ } 
    });
});

关键点:

有道智云AI开放平台
有道智云AI开放平台

有道智云AI开放平台

下载
  • showUpload: false 和 fileActionSettings: { showUpload: false } 确保Krajee的上传按钮不会出现,我们将完全依赖表单的提交按钮。
  • 不要设置 uploadUrl 和 uploadAsync,这会使Krajee尝试进行自己的AJAX上传,从而与我们的表单提交逻辑冲突。

4. 实现AJAX表单提交

现在,我们将编写jQuery AJAX代码来监听表单的提交事件,收集所有数据(包括文件),并通过AJAX发送到Laravel控制器。

$(document).ready(function() {
    // ... Krajee 文件输入初始化代码 ...

    $('#upload_form').on('submit', function(e) {
        e.preventDefault(); // 阻止表单默认的提交行为

        // 使用 FormData 收集表单所有数据,包括文件
        // $(this)[0] 获取原生的 DOM 元素
        var formData = new FormData($(this)[0]);

        // 确保 CSRF 令牌已包含在 formData 中。
        // 如果 HTML 中使用了 @csrf,则 formData 会自动包含 _token。
        // 如果没有,可以手动添加:
        // formData.append('_token', $('meta[name="csrf-token"]').attr('content')); 
        // 或者从隐藏字段获取:
        // formData.append('_token', $('input[name="_token"]').val());

        $.ajax({
            method: 'POST', // 请求方法为 POST
            url: 'create', // 你的 Laravel 路由 URL
            dataType: 'json', // 预期服务器返回的数据类型
            cache: false, // 禁用缓存
            processData: false, // 告诉 jQuery 不要处理数据
            contentType: false, // 告诉 jQuery 不要设置 Content-Type 头部
            data: formData, // 发送 FormData 对象
            beforeSend: function() {
                console.log('正在发送数据...');
                // 可以在此处显示加载动画
            },
            success: function(response) {
                console.log('上传成功!', response);
                // 处理成功响应,例如显示成功消息、重定向等
                alert('文件和数据已成功上传!');
            },
            error: function(xhr, status, error) {
                console.error('上传失败!', xhr.responseText);
                // 处理错误响应,例如显示错误消息
                alert('上传失败:' + xhr.responseText);
            }
        });
    });
});

关键点:

  • e.preventDefault(): 阻止浏览器进行标准的页面刷新表单提交。
  • new FormData($(this)[0]): 这是获取表单所有数据(包括文件)的最简洁和推荐方式。
  • processData: false 和 contentType: false: 这两个设置对于发送包含文件的FormData至关重要。它们告诉jQuery不要尝试将FormData对象转换为字符串或设置默认的Content-Type头部,而是让浏览器自动处理multipart/form-data的编码。

5. 在Laravel控制器中处理上传

最后,在Laravel控制器中,我们将接收并处理前端发送过来的数据和文件。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; // 用于文件存储

class FlipbookController extends Controller
{
    public function create(Request $request)
    {
        // 1. 验证请求数据
        $request->validate([
            'cliente_titulo' => 'required|string|max:255',
            'cliente_data' => 'required|date_format:Y/m', // 假设日期格式为 YYYY/MM
            'cliente_cliente' => 'required|string|max:255',
            'cliente_condominio' => 'required|string|max:255',
            'pdf_file' => 'required|mimes:pdf|max:10240', // 验证 PDF 文件,最大10MB
        ]);

        // 2. 获取文本输入数据
        $titulo = $request->input('cliente_titulo');
        $data = $request->input('cliente_data');
        $cliente = $request->input('cliente_cliente');
        $condominio = $request->input('cliente_condominio');

        // 可以通过 $request->all() 获取所有非文件输入数据
        // $allInputs = $request->all(); 
        // dd($allInputs); // 调试时查看所有文本数据

        // 3. 处理文件上传
        if ($request->hasFile('pdf_file')) { // 检查请求中是否存在名为 'pdf_file' 的文件
            $file = $request->file('pdf_file'); // 获取 UploadedFile 实例

            // 生成一个唯一的文件名
            $fileName = time() . '_' . uniqid() . '.' . $file->getClientOriginalExtension();

            // 将文件存储到 'public/pdfs' 目录下
            // Storage::disk('public') 会将文件存放在 storage/app/public 目录下
            // 要通过 URL 访问,需要运行 php artisan storage:link 创建软链接
            $filePath = $file->storeAs('pdfs', $fileName, 'public'); 

            // 可以获取文件的公共访问 URL
            $fileUrl = Storage::url($filePath);

            // 示例:将文件信息和表单数据保存到数据库
            // YourModel::create([
            //     'title' => $titulo,
            //     'date' => $data,
            //     'client' => $cliente,
            //     'condominium' => $condominio,
            //     'pdf_path' => $filePath, // 保存文件路径
            //     'pdf_url' => $fileUrl,   // 保存文件URL
            // ]);

            return response()->json([
                'message' => '文件和数据上传成功!',
                'data' => [
                    'titulo' => $titulo,
                    'data' => $data,
                    'cliente' => $cliente,
                    'condominio' => $condominio,
                    'pdf_path' => $filePath,
                    'pdf_url' => $fileUrl,
                ]
            ], 200);

        } else {
            // 如果没有文件上传,返回错误
            return response()->json(['message' => '未找到上传的PDF文件。'], 400);
        }
    }
}

关键点:

  • $request->validate(): 在处理数据之前进行验证是最佳实践,确保数据的有效性和安全性。
  • $request->hasFile('pdf_file'): 这是检查特定文件输入字段是否有文件上传的正确方法。
  • $request->file('pdf_file'): 获取Illuminate\Http\UploadedFile实例,通过它可以访问文件的各种属性(如原始文件名、MIME类型、大小等)并执行存储操作。
  • $file->storeAs('pdfs', $fileName, 'public'): Laravel提供了一个便捷的storeAs方法来存储文件。第一个参数是存储的子目录,第二个是自定义文件名,第三个是磁盘名称(public磁盘通常用于可公开访问的文件)。
  • Storage::url($filePath): 如果文件存储在public磁盘,并且您已经运行了php artisan storage:link,则可以使用此方法获取文件的公共URL。
  • dd($request->all(), $request->files->all()): 在调试时,使用dd()来分别查看所有文本输入数据和所有上传的文件数据是非常有用的。$request->all()返回表单的文本数据,而$request->files->all()返回所有UploadedFile实例的数组。

6. 总结与注意事项

通过以上步骤,您已经成功构建了一个使用Krajee文件输入、AJAX和Laravel协同工作的表单上传系统。

重要注意事项:

  • CSRF保护: 确保您的表单包含CSRF令牌,Laravel会自动验证它。
  • 文件验证: 始终在后端(Laravel控制器)进行严格的文件验证,包括文件类型、大小等,以防止恶意文件上传。
  • 错误处理: 前端和后端都应包含健壮的错误处理机制,向用户提供清晰的反馈。
  • 文件存储: 选择合适的存储策略。对于公开访问的文件,使用public磁盘并创建软链接;对于私有文件,使用默认的local磁盘。
  • 安全性: 存储文件时,生成唯一的文件名,并考虑文件内容的安全性扫描。

遵循这些指南,您将能够构建一个稳定、安全且用户友好的文件上传功能。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

339

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

293

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

772

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

141

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

80

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

453

2026.03.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号