Skip to content

Commit 3a543d5

Browse files
add save images into mongo
1 parent eb21d66 commit 3a543d5

File tree

5 files changed

+59
-35
lines changed

5 files changed

+59
-35
lines changed

server/api/admin/image/all.get.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { defineEventHandler, createError } from 'h3'
2-
import { db } from '~/server/utils/mongo'
2+
import { db, getBlogImageBucket } from '~/server/utils/mongo'
33

44
export default defineEventHandler(async (event) => {
55
const isAuth = event.context?.auth?.username || false
@@ -9,10 +9,11 @@ export default defineEventHandler(async (event) => {
99
statusMessage: 'Unauthorized'
1010
})
1111
}
12-
const images = await db.collection('images').find().toArray()
12+
const bucket = await getBlogImageBucket()
13+
const allImages = await bucket.find().toArray()
1314
return {
14-
images: images.map((image) => ({
15-
url: `api/image/${image.key}`
15+
images: allImages.map((image) => ({
16+
url: `api/image/${image.filename}`
1617
}))
1718
}
1819
})

server/api/admin/image/upload.post.js

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { defineEventHandler, readMultipartFormData, createError } from 'h3'
22
import { generateSessionId } from '~/server/utils/string'
3-
import { db } from '~/server/utils/mongo'
3+
import { getBlogImageBucket } from '~/server/utils/mongo'
4+
import { Readable } from 'stream'
45

56
export default defineEventHandler(async (event) => {
67
const isAuth = event.context?.auth?.username || false
@@ -33,23 +34,30 @@ export default defineEventHandler(async (event) => {
3334

3435
const buffer = Buffer.from(file.data)
3536

36-
try {
37-
await db.collection('images').insertOne({
38-
key: fileKey,
39-
originalFilename: file.filename,
37+
const bucket = await getBlogImageBucket()
38+
39+
await new Promise((resolve, reject) => {
40+
const readableStream = Readable.from(buffer)
41+
const uploadStream = bucket.openUploadStream(fileKey, {
4042
contentType: file.type,
41-
data: buffer,
42-
createdAt: new Date()
43+
metadata: {
44+
originalFilename: file.filename,
45+
createdAt: new Date()
46+
}
4347
})
4448

45-
return {
46-
fileKey: fileKey
47-
}
48-
} catch (error) {
49-
console.error('MongoDB insert error:', error)
50-
throw createError({
51-
statusCode: 500,
52-
statusMessage: 'Error saving file to MongoDB'
53-
})
49+
readableStream
50+
.pipe(uploadStream)
51+
.on('error', (error) => {
52+
console.error('Error uploading to GridFS:', error)
53+
reject(error)
54+
})
55+
.on('finish', () => {
56+
resolve()
57+
})
58+
})
59+
60+
return {
61+
fileKey: fileKey
5462
}
5563
})

server/api/image/[key].get.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

server/api/image/[slug].get.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { getBlogImageBucket } from '~/server/utils/mongo'
2+
3+
export default defineEventHandler(async (event) => {
4+
const slug = event.context.params.slug
5+
6+
const bucket = await getBlogImageBucket()
7+
const readStream = bucket.openDownloadStreamByName(slug)
8+
9+
setResponseHeaders(event, {
10+
'Content-Type': 'image/jpeg',
11+
'Cache-Control': 'public, max-age=86400' // Cache for 1 day
12+
})
13+
return readStream
14+
})

server/utils/mongo.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { MongoClient } from 'mongodb'
1+
import { MongoClient, GridFSBucket } from 'mongodb'
22
import { getConfig } from '~/server/utils/config'
33

44
const mongoUrl = getConfig().mongoUri
@@ -37,3 +37,18 @@ export async function connectDB() {
3737
}
3838
return db2
3939
}
40+
41+
let blogImageBucket
42+
43+
/**
44+
* @returns {Promise<GridFSBucket>}
45+
*/
46+
export async function getBlogImageBucket() {
47+
await connectDB()
48+
if (!blogImageBucket) {
49+
blogImageBucket = new GridFSBucket(db, {
50+
bucketName: 'blogImages'
51+
})
52+
}
53+
return blogImageBucket
54+
}

0 commit comments

Comments
 (0)