diff --git a/Reject.js b/Reject.js index 948d720..8f17782 100644 --- a/Reject.js +++ b/Reject.js @@ -768,37 +768,48 @@ app.post('/api/supplies/create', async (req, res) => { // 生成唯一的productId const productId = `product_${Date.now()}_${Math.floor(Math.random() * 1000)}`; - // 处理图片上传 + // 处理媒体文件上传(图片和视频) let uploadedImageUrls = []; if (Array.isArray(imageUrls) && imageUrls.length > 0) { - console.log('开始处理图片上传,共', imageUrls.length, '张图片'); + console.log('开始处理媒体文件上传,共', imageUrls.length, '个文件'); - for (const imageUrl of imageUrls) { - if (imageUrl.startsWith('data:image/')) { + for (const mediaUrl of imageUrls) { + if (mediaUrl.startsWith('data:image/') || mediaUrl.startsWith('data:video/')) { // 处理DataURL - const base64Data = imageUrl.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); + let base64Data, ext, fileType; + if (mediaUrl.startsWith('data:image/')) { + // 图片类型 + base64Data = mediaUrl.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); + ext = mediaUrl.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; + fileType = 'image'; + } else { + // 视频类型 + base64Data = mediaUrl.replace(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/, ''); + ext = mediaUrl.match(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/)?.[1] || 'mp4'; + fileType = 'video'; + } + let buffer = Buffer.from(base64Data, 'base64'); - const ext = imageUrl.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; const filename = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; try { // 不再添加水印,前端已处理 console.log('【水印处理】前端已添加水印,跳过后端水印处理'); - // 使用OSS上传带水印的图片 - const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `products/${productName || 'general'}`, 'image'); + // 使用OSS上传媒体文件 + const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `products/${productName || 'general'}`, fileType); uploadedImageUrls.push(ossUrl); - console.log('图片上传成功:', ossUrl); + console.log(`${fileType}上传成功:`, ossUrl); } catch (uploadError) { - console.error('图片上传失败:', uploadError.message); - // 继续上传其他图片,不中断流程 + console.error(`${fileType}上传失败:`, uploadError.message); + // 继续上传其他文件,不中断流程 } } else { // 已经是URL,直接使用 - uploadedImageUrls.push(imageUrl); + uploadedImageUrls.push(mediaUrl); } } - console.log('图片处理完成,成功上传', uploadedImageUrls.length, '张图片'); + console.log('媒体文件处理完成,成功上传', uploadedImageUrls.length, '个文件'); } // 创建商品数据 @@ -883,16 +894,86 @@ app.post('/api/supplies/create', async (req, res) => { } }); -// 图片上传API - /api/upload-image +// 媒体文件上传API - /api/upload-media +console.log('正在注册媒体文件上传API路由: /api/upload-media'); +app.post('/api/upload-media', async (req, res) => { + console.log('收到媒体文件上传请求:', req.body); + try { + const { fileData, fileName, folder = 'general' } = req.body; + + // 验证参数 + if (!fileData) { + return sendResponse(res, false, null, '文件数据不能为空'); + } + + let base64Data, ext, fileType; + if (fileData.startsWith('data:image/')) { + // 图片类型 + base64Data = fileData.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); + ext = fileData.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; + fileType = 'image'; + } else if (fileData.startsWith('data:video/')) { + // 视频类型 + base64Data = fileData.replace(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/, ''); + ext = fileData.match(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/)?.[1] || 'mp4'; + fileType = 'video'; + } else { + return sendResponse(res, false, null, '不支持的文件类型'); + } + + let buffer = Buffer.from(base64Data, 'base64'); + const filename = fileName || `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; + + try { + // 使用OSS上传媒体文件 + const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `uploads/${folder}`, fileType); + console.log(`${fileType}上传成功:`, ossUrl); + + sendResponse(res, true, { + url: ossUrl, + fileType: fileType, + message: `${fileType}上传成功` + }, `${fileType}上传成功`); + } catch (uploadError) { + console.error(`${fileType}上传失败:`, uploadError.message); + sendResponse(res, false, null, `${fileType}上传失败: ${uploadError.message}`); + } + } catch (error) { + console.error('媒体文件上传API错误:', error.message); + sendResponse(res, false, null, `媒体文件上传失败: ${error.message}`); + } +}); + +// 图片上传API - /api/upload-image(兼容旧接口) console.log('正在注册图片上传API路由: /api/upload-image'); app.post('/api/upload-image', async (req, res) => { - console.log('收到图片上传请求'); - // 注意:这里需要实现实际的图片上传逻辑,包括OSS配置 - // 由于当前缺少OSS配置,返回模拟数据 - sendResponse(res, true, { - imageUrl: 'https://example.com/image.jpg', - message: '图片上传成功' - }, '图片上传成功'); + console.log('收到图片上传请求,转发到媒体文件上传API'); + // 将请求转发到媒体文件上传API + const uploadMediaHandler = app._router.stack.find(layer => + layer.route && layer.route.path === '/api/upload-media' && layer.route.methods['post'] + ); + + if (uploadMediaHandler && uploadMediaHandler.route && uploadMediaHandler.route.stack[0]) { + return uploadMediaHandler.route.stack[0].handle(req, res); + } else { + sendResponse(res, false, null, '图片上传API内部错误'); + } +}); + +// 视频上传API - /api/upload-video(专门的视频上传接口) +console.log('正在注册视频上传API路由: /api/upload-video'); +app.post('/api/upload-video', async (req, res) => { + console.log('收到视频上传请求,转发到媒体文件上传API'); + // 将请求转发到媒体文件上传API + const uploadMediaHandler = app._router.stack.find(layer => + layer.route && layer.route.path === '/api/upload-media' && layer.route.methods['post'] + ); + + if (uploadMediaHandler && uploadMediaHandler.route && uploadMediaHandler.route.stack[0]) { + return uploadMediaHandler.route.stack[0].handle(req, res); + } else { + sendResponse(res, false, null, '视频上传API内部错误'); + } }); // 获取审核失败原因API - /api/supplies/:id/reject-reason @@ -1089,6 +1170,53 @@ app.put('/api/supplies/:id/edit', async (req, res) => { } } +<<<<<<< Updated upstream +======= + // 处理媒体文件上传(图片和视频) + let uploadedImageUrls = []; + if (Array.isArray(imageUrls) && imageUrls.length > 0) { + console.log('开始处理编辑媒体文件上传,共', imageUrls.length, '个文件'); + + for (const mediaUrl of imageUrls) { + if (mediaUrl.startsWith('data:image/') || mediaUrl.startsWith('data:video/')) { + // 处理DataURL + let base64Data, ext, fileType; + if (mediaUrl.startsWith('data:image/')) { + // 图片类型 + base64Data = mediaUrl.replace(/^data:image\/(png|jpeg|jpg|gif);base64,/, ''); + ext = mediaUrl.match(/^data:image\/(png|jpeg|jpg|gif);base64,/)?.[1] || 'png'; + fileType = 'image'; + } else { + // 视频类型 + base64Data = mediaUrl.replace(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/, ''); + ext = mediaUrl.match(/^data:video\/(mp4|mov|avi|wmv|flv);base64,/)?.[1] || 'mp4'; + fileType = 'video'; + } + + let buffer = Buffer.from(base64Data, 'base64'); + const filename = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${ext}`; + + try { + // 不再添加水印,前端已处理 + console.log('【水印处理】前端已添加水印,跳过后端水印处理'); + + // 使用OSS上传媒体文件 + const ossUrl = await OssUploader.uploadBuffer(buffer, filename, `products/${productName || 'general'}`, fileType); + uploadedImageUrls.push(ossUrl); + console.log(`${fileType}上传成功:`, ossUrl); + } catch (uploadError) { + console.error(`${fileType}上传失败:`, uploadError.message); + // 继续上传其他文件,不中断流程 + } + } else { + // 已经是URL,直接使用 + uploadedImageUrls.push(mediaUrl); + } + } + console.log('媒体文件处理完成,成功上传', uploadedImageUrls.length, '个文件'); + } + +>>>>>>> Stashed changes // 更新货源信息 const updateQuery = ` UPDATE products diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index ee13f04..f39158a 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,5 +1,9 @@ { +<<<<<<< Updated upstream "name": "Review2", +======= + "name": "boss", +>>>>>>> Stashed changes "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package-lock.json b/package-lock.json index a42c8c5..0ba49cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,9 @@ { +<<<<<<< Updated upstream "name": "Review2", +======= + "name": "boss", +>>>>>>> Stashed changes "lockfileVersion": 3, "requires": true, "packages": { diff --git a/supply.html b/supply.html index 395d679..0b149c2 100644 --- a/supply.html +++ b/supply.html @@ -1052,13 +1052,13 @@ - +