[英]NextJS file upload to Google Cloud Storage successful but always uploading 0 byte file - using formidable
我試圖在 nextJS 和 stream 文件中實現文件上傳到谷歌雲存儲。 我正在使用強大的。 Formidable 給了我一個文件路徑、新文件名、文件大小等,但是當文件出現在谷歌存儲中時,它的字節數為零。 這就像正在創建位置,但我的 blob stream 實際上並沒有將文件推送到那里。
下面是我的 api 路線的代碼。 有任何想法嗎?
import { Storage } from "@google-cloud/storage";
import formidable from '../../lib/formidable-serverless'
export const config = {
api: {
bodyParser: false,
},
};
export default async function handler(req, res) {
console.log('req')
const storage = new Storage({
projectId: process.env.GOOGLE_SERVICE_ID,
client_email: process.env.GOOGLE_CLIENT_EMAIL,
private_key: process.env.GOOGLE_SERVICE_KEY,
});
const data = await new Promise(function(resolve, reject) {
const form = new formidable.IncomingForm();
form.keepExtensions = true;
form.parse(req, function(err, fields, files) {
if (err) return reject(err);
resolve({ fields, files });
});
});
const file = data.files.file
try {
const bucket = storage.bucket(process.env.GCS_BUCKET)
const blob = bucket.file(file.originalFilename);
const blobStream = blob.createWriteStream({
resumable: false,
});
blobStream.on("error", (err) => {
console.log('ERR', err.message)
res.status(500).send({ message: err.message });
});
blobStream.on("finish", async () => {
const publicURL = `https://storage.googleapis.com/${bucket.name}/${blob.name}`
;
try {
await blob.makePublic();
} catch {
return res.status(500).send({
message: `Uploaded the file successfully: ${file.newFilename}, but public access is denied!`,
url: publicURL,
});
}
res.status(200).send({
message: "Uploaded the file successfully: " + file.newFilename,
url: publicURL,
});
});
blobStream.end();
} catch (err) {
if (err.code == "LIMIT_FILE_SIZE") {
console.log('ERR', err.message)
return res.status(500).send({
message: "File size cannot be larger than 25MB!",
});
}
res.status(500).send({
message: `Could not upload the file: ${file.newFilename}. ${err}`,
});
}
這是我的 blobstream 創建后的樣子。
Writable {
_writableState: WritableState {
objectMode: false,
highWaterMark: 16384,
finalCalled: false,
needDrain: false,
ending: false,
ended: false,
finished: false,
destroyed: false,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,
corked: 0,
sync: true,
bufferProcessing: false,
onwrite: [Function: bound onwrite],
writecb: null,
writelen: 0,
afterWriteTickInfo: null,
buffered: [],
bufferedIndex: 0,
allBuffers: true,
allNoop: true,
pendingcb: 0,
prefinished: false,
errorEmitted: false,
emitClose: true,
autoDestroy: true,
errored: null,
closed: false
},
這就是強大的 promise 解決后文件的樣子。 那里還有一個可寫的 stream。
PersistentFile {
_events: [Object: null prototype] { error: [Function (anonymous)] },
_eventsCount: 1,
_maxListeners: undefined,
lastModifiedDate: 2022-11-22T14:54:26.597Z,
filepath: '/var/folders/yb/l636l56d7ng731jp24crv6lw0000gn/T/9e8fb9b8b1e0740b2622b990b',
newFilename: '9e8fb9b8b1e0740b2622b990b',
originalFilename: '17.mp3',
mimetype: 'audio/mpeg',
hashAlgorithm: false,
size: 7020751,
_writeStream: WriteStream {
_writableState: WritableState {
objectMode: false,
highWaterMark: 16384,
finalCalled: true,
needDrain: true,
ending: true,
ended: true,
finished: true,
destroyed: true,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,...
}
當我創建我的 blob 時,我是否以某種方式沒有將我的文件傳遞到 writestream 中?
作為社區維基回答,
這可以通過實現一個readStream
來解決,該 readStream 讀取 formidable 在writestream
開始之前臨時存儲文件的文件路徑。
createReadStream(file.filepath)
.pipe(blob.createWriteStream(file.originalFilename, file.mimetype))
console.log('blobstream', blobStream)
.on("error", (err) => { console.log('ERR', err.message)
res.status(500).send({ message: err.message
});
})
.on("finish", async () => { // create a url to access file ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.