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

Vercel Blob文件无法上传至指定文件夹问题排查求助

问题:Vercel Blob无法上传文件到指定文件夹,总是传到根目录

我正在开发一个JS项目,使用Vercel Blob做存储,整体功能正常,但无法将文件上传到已创建的"IndieSongs"文件夹,文件总是默认传到根目录。以下是我的后端代码实现:

import { NextResponse } from "next/server";
import { handleUpload } from "@vercel/blob/client";
import type { HandleUploadBody } from "@vercel/blob/client";

import { auth } from "@voiceai/auth";

export async function POST(request: Request): Promise<NextResponse> {
  const body = (await request.json()) as HandleUploadBody;

  try {
    const jsonResponse = await handleUpload({
      body,
      request,
      onBeforeGenerateToken: async (pathname) => {
        const user = await auth();
        if (!user) {
          throw new Error("User not authenticated");
        }
        // Set the folder name and append the file name from the original pathname
        const folderName = "IndieSongs";
        const filePath = `${folderName}/${pathname.split("/").pop()}`;
        return {
          allowedContentTypes: [
            "audio/mpeg", // mp3, mpga
            "audio/wav", // wav
            "audio/mp4", // m4a
            "audio/webm", // webm
            "video/mp4", // mp4
            "video/mpeg", // mpeg
          ],
          pathname: filePath,
        };
      },
      onUploadCompleted: async ({ blob }) => {
        console.log("Upload completed:", blob);
        // Implement any additional logic here, e.g., saving the URL to your database
      },
    });

    return NextResponse.json(jsonResponse);
  } catch (error) {
    return NextResponse.json(
      { error: (error as Error).message },
      { status: 400 },
    );
  }
}

设置pathname后没有任何变化,效果和不设置时完全一致,求解决思路。


解决思路
  • 排查pathname的处理逻辑:先在onBeforeGenerateToken里打印原始的pathname值,确认前端传入的文件路径是否符合预期。如果pathname本身就是纯文件名(比如song.mp3),当前的split("/").pop()没问题;如果pathname包含斜杠,可简化为pathname.split("/").pop() || pathname避免空值导致的路径错误。
  • 理解Vercel Blob的虚拟文件夹机制:Vercel Blob不需要提前创建文件夹,只要上传路径包含文件夹名/文件名的格式,系统会自动生成对应的虚拟目录。手动创建的文件夹不影响上传路径,重点是确保生成的token中pathname是IndieSongs/xxx.mp3这种正确格式。
  • 更新依赖包版本:旧版本的@vercel/blob可能存在pathname覆盖不生效的bug,执行npm update @vercel/blob将包更新到最新版本后再测试。
  • 验证token返回的pathname:在onBeforeGenerateToken里打印最终的filePath,确认它是IndieSongs/xxx.mp3的格式,没有多余的斜杠或者拼写错误(Vercel Blob路径区分大小写)。
  • 检查前端上传请求:确认前端调用该API时,是否正确传递了pathname参数。可以在后端先打印body.pathname的值,看前端是否传入了正确的文件名,避免前端传参为空或错误导致路径处理异常。

内容的提问来源于stack exchange,提问作者Martín Fernandez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:22:37