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
相关产品推荐
相关产品推荐

