File tree Expand file tree Collapse file tree 5 files changed +59
-35
lines changed
Expand file tree Collapse file tree 5 files changed +59
-35
lines changed Original file line number Diff line number Diff line change 11import { defineEventHandler , createError } from 'h3'
2- import { db } from '~/server/utils/mongo'
2+ import { db , getBlogImageBucket } from '~/server/utils/mongo'
33
44export 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} )
Original file line number Diff line number Diff line change 11import { defineEventHandler , readMultipartFormData , createError } from 'h3'
22import { 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
56export 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} )
Load Diff This file was deleted.
Original file line number Diff line number Diff line change 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+ } )
Original file line number Diff line number Diff line change 1- import { MongoClient } from 'mongodb'
1+ import { MongoClient , GridFSBucket } from 'mongodb'
22import { getConfig } from '~/server/utils/config'
33
44const 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+ }
You can’t perform that action at this time.
0 commit comments