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

Symfony6.4+OneUpUploaderBundle+Uppy上传后如何展示服务端错误

解决Uppy无法接收OneUpUploaderBundle校验错误的方案

1. 自定义异常监听捕获ValidationException

写一个专门的监听类,捕获ValidationException后返回Uppy能识别的错误响应,同时设置非200的HTTP状态码(Uppy只把200系列状态码判定为上传成功)。

示例代码:

// src/EventListener/UploadValidationExceptionListener.php
namespace App\EventListener;

use Oneup\UploaderBundle\Exception\ValidationException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class UploadValidationExceptionListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::EXCEPTION => 'onKernelException',
        ];
    }

    public function onKernelException(ExceptionEvent $event): void
    {
        $exception = $event->getThrowable();
        if (!$exception instanceof ValidationException) {
            return;
        }

        // 构造Uppy可解析的错误格式
        $response = new JsonResponse([
            'error' => true,
            'message' => $exception->getMessage(),
        ], 422); // 用422更贴合校验失败的场景

        $event->setResponse($response);
    }
}

Symfony默认autoconfigure会自动注册这个类,也可以手动在services.yaml里配置。

2. 配置Uppy监听错误事件

Uppy Dashboard不会自动解析服务端错误,需要监听upload-error事件来展示提示。

示例JS代码:

import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Blueimp from '@uppy/blueimp'

const uppy = new Uppy({
    debug: true,
    autoProceed: false
})
.use(Dashboard, {
    target: '#uppy-dashboard',
    inline: true
})
.use(Blueimp, {
    endpoint: '/your-upload-endpoint' // 替换成你的上传接口地址
})

// 监听上传错误,自定义错误提示
uppy.on('upload-error', (file, error) => {
    const errorMsg = error.response?.data?.message || '文件格式不符合要求,请重新选择';
    uppy.setFileState(file.id, {
        error: errorMsg,
        isError: true
    });
});

3. 检查OneUpUploaderBundle配置

确保上传器配置没有禁用异常处理,在config/packages/oneup_uploader.yaml里:

oneup_uploader:
    mappings:
        your_uploader_name:
            frontend: blueimp
            storage:
                service: oneup_uploader.storage.filesystem
                filesystem: oneup_uploader.filesystem.your_uploader_name
            # 确认这个配置是false,否则默认异常监听会被禁用
            disable_exception_listener: false

核心要点

  • 必须返回JSON格式的错误响应+非200状态码,Uppy才会判定为上传失败。
  • 不要依赖OneUp的默认异常处理,它的响应格式不符合Uppy的预期。

内容的提问来源于stack exchange,提问作者Rikijs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:52:20