英文:
How can I upload images to an Amazon S3 bucket using Next.js 13's app router and overcome API route structure changes?
问题
如何在Next.js 13上使用应用程序路由器将图像上传到Amazon S3存储桶?
我尝试使用formidable和multer,但由于Next.js更改了其API路由结构,这两种解决方案都无法正常工作:
import { NextRequest, NextResponse } from "next/server";
import { v4 as uuid } from "uuid";
import multer from "multer";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { IncomingForm } from "formidable";
const s3Client = new S3Client({
region: process.env.REGION as string,
credentials: {
accessKeyId: process.env.ACCESS_KEY as string,
secretAccessKey: process.env.SECRET_KEY as string,
},
});
async function uploadImageToS3(
file: Buffer,
fileName: string
): Promise<string> {
const params = {
Bucket: process.env.BUCKET_NAME as string,
Key: `${Date.now()}-${fileName}`,
Body: file,
ContentType: "image/jpeg", // 根据需要更改内容类型
};
const command = new PutObjectCommand(params);
await s3Client.send(command);
return fileName;
}
export async function POST(request: NextRequest, response: NextResponse) {
try {
const formData = await request.formData();
// 如何传递缓冲区并将图像存储在S3存储桶中??
} catch (error) {
console.error("上传图像时出错:", error);
NextResponse.json({ message: "上传图像出错" });
}
}
英文:
How to upload images to amazon s3 bucket on nextjs13 using app router?
I tried using formidable and multer but both soltions are not working as nextjs changes their api routes structure:
import { NextRequest, NextResponse } from "next/server";
import { v4 as uuid } from "uuid";
import multer from "multer";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { IncomingForm } from "formidable";
const s3Client = new S3Client({
region: process.env.REGION as string,
credentials: {
accessKeyId: process.env.ACCESS_KEY as string,
secretAccessKey: process.env.SECRET_KEY as string,
},
});
async function uploadImageToS3(
file: Buffer,
fileName: string
): Promise<string> {
const params = {
Bucket: process.env.BUCKET_NAME as string,
Key: `${Date.now()}-${fileName}`,
Body: file,
ContentType: "image/jpeg", // Change the content type accordingly
};
const command = new PutObjectCommand(params);
await s3Client.send(command);
return fileName;
}
export async function POST(request: NextRequest, response: NextResponse) {
try {
const formData = await request.formData();
// How to pass the buffer and store the image on s3 bucket ???
} catch (error) {
console.error("Error uploading image:", error);
NextResponse.json({ message: "Error uploading image" });
}
}
答案1
得分: 5
最终,在尝试了很多次后,这是解决方案:
import { NextRequest, NextResponse } from "next/server";
import { v4 as uuid } from "uuid";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import sharp from "sharp";
const s3Client = new S3Client({
region: process.env.REGION as string,
credentials: {
accessKeyId: process.env.ACCESS_KEY as string,
secretAccessKey: process.env.SECRET_KEY as string,
},
});
async function uploadImageToS3(
file: Buffer,
fileName: string
): Promise<string> {
const resizedImageBuffer = await sharp(file)
.resize(400, 500) // Specify your desired width or height for resizing
.toBuffer();
const params = {
Bucket: process.env.BUCKET_NAME as string,
Key: `${Date.now()}-${fileName}`,
Body: resizedImageBuffer,
ContentType: "image/jpeg", // Change the content type accordingly
};
const command = new PutObjectCommand(params);
await s3Client.send(command);
return fileName;
}
export async function POST(request: NextRequest, response: NextResponse) {
try {
const formData = await request.formData();
const file = formData.get("file") as Blob | null;
if (!file) {
return NextResponse.json(
{ error: "File blob is required." },
{ status: 400 }
);
}
const mimeType = file.type;
const fileExtension = mimeType.split("/")[1];
const buffer = Buffer.from(await file.arrayBuffer());
const fileName = await uploadImageToS3(
buffer,
uuid() + "." + fileExtension
);
return NextResponse.json({ success: true, fileName });
} catch (error) {
console.error("Error uploading image:", error);
NextResponse.json({ message: "Error uploading image" });
}
}
英文:
Finally after much trying, here is the solution:
import { NextRequest, NextResponse } from "next/server";
import { v4 as uuid } from "uuid";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import sharp from "sharp";
const s3Client = new S3Client({
region: process.env.REGION as string,
credentials: {
accessKeyId: process.env.ACCESS_KEY as string,
secretAccessKey: process.env.SECRET_KEY as string,
},
});
async function uploadImageToS3(
file: Buffer,
fileName: string
): Promise<string> {
const resizedImageBuffer = await sharp(file)
.resize(400, 500) // Specify your desired width or height for resizing
.toBuffer();
const params = {
Bucket: process.env.BUCKET_NAME as string,
Key: `${Date.now()}-${fileName}`,
Body: resizedImageBuffer,
ContentType: "image/jpeg", // Change the content type accordingly
};
const command = new PutObjectCommand(params);
await s3Client.send(command);
return fileName;
}
export async function POST(request: NextRequest, response: NextResponse) {
try {
const formData = await request.formData();
const file = formData.get("file") as Blob | null;
if (!file) {
return NextResponse.json(
{ error: "File blob is required." },
{ status: 400 }
);
}
const mimeType = file.type;
const fileExtension = mimeType.split("/")[1];
const buffer = Buffer.from(await file.arrayBuffer());
const fileName = await uploadImageToS3(
buffer,
uuid() + "." + fileExtension
);
return NextResponse.json({ success: true, fileName });
} catch (error) {
console.error("Error uploading image:", error);
NextResponse.json({ message: "Error uploading image" });
}
}
答案2
得分: 0
你需要修改代码。希望这对你有帮助。
import { NextRequest, NextResponse } from "next/server";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { createReadStream } from "fs";
import { v4 as uuid } from "uuid";
const s3Client = new S3Client({
region: process.env.REGION as string,
credentials: {
accessKeyId: process.env.ACCESS_KEY as string,
secretAccessKey: process.env.SECRET_KEY as string,
},
});
async function uploadImageToS3(
fileStream: NodeJS.ReadableStream,
fileName: string
): Promise<string> {
const params = {
Bucket: process.env.BUCKET_NAME as string,
Key: `${Date.now()}-${fileName}`,
Body: fileStream,
ContentType: "image/jpeg",
};
const command = new PutObjectCommand(params);
await s3Client.send(command);
return fileName;
}
export async function POST(request: NextRequest, response: NextResponse) {
try {
const { file } = request.files; // 假设文件输入的名称为 'file'
const { path, name } = file;
const fileStream = createReadStream(path);
const uploadedFileName = await uploadImageToS3(fileStream, name);
response.json({ fileName: uploadedFileName });
} catch (error) {
console.error("上传图片出错:", error);
response.json({ message: "上传图片出错" });
}
}
英文:
You need to modify code. Hope this helpful for you.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
import { NextRequest, NextResponse } from "next/server";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { createReadStream } from "fs";
import { v4 as uuid } from "uuid";
const s3Client = new S3Client({
region: process.env.REGION as string,
credentials: {
accessKeyId: process.env.ACCESS_KEY as string,
secretAccessKey: process.env.SECRET_KEY as string,
},
});
async function uploadImageToS3(
fileStream: NodeJS.ReadableStream,
fileName: string
): Promise<string> {
const params = {
Bucket: process.env.BUCKET_NAME as string,
Key: `${Date.now()}-${fileName}`,
Body: fileStream,
ContentType: "image/jpeg",
};
const command = new PutObjectCommand(params);
await s3Client.send(command);
return fileName;
}
export async function POST(request: NextRequest, response: NextResponse) {
try {
const { file } = request.files; // Assuming the file input name is 'file'
const { path, name } = file;
const fileStream = createReadStream(path);
const uploadedFileName = await uploadImageToS3(fileStream, name);
response.json({ fileName: uploadedFileName });
} catch (error) {
console.error("Error uploading image:", error);
response.json({ message: "Error uploading image" });
}
}
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论