在实现上传图片同时将服务端返回的url,从而实现一个简单的上传图片显示缩略图的效果,但是当图片成功上传之后,以至于成功返回URL之后,却无法正常显示图片,获取的URL经过中间件处理,我企图希望url为服务端的文件夹位置,但是由于没有经验,所以不知道要怎么书写http格式的URL
我首先获取了图片位置的绝对路径(本地端服务器),大概内容如下:
file:///D:/项目位置/assets/imageUpload/xxx1.jpg
这是能够直接使用浏览器进行本机文件进行访问的,但是要想实现http URL格式,需要写成大概如下格式:
但是我不论怎么修改http URL,都是无法正常显示,主要原因是无法解析上述端口号后面的路径,所以需要在服务端使用中间件对上传的文件路径进行解析,具体解决方法如下:
app.use('/assets', express.static(path.join(__dirname, 'assets')));
上述部分是直接在Index中设置静态文件路由,从而使得http访问到assets路径时会对应查找服务端内的正确路径;
// 指定资源路由配置文件
router.post('/imageUpload',imageUpload.single('file'),chatsController.imageUpload)
// 调用的中间件操作,用于处理image
const multer = require('multer');
const path = require('path');
// 配置存储和文件命名
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, '../assets/imageUpload'); // 设置存储目录
},
filename: (req, file, cb) => {
const uniqueSuffix = `${Date.now()}-${Math.round(Math.random() * 1e9)}`; // 生成唯一的文件名
const fileExtension = path.extname(file.originalname); // 获取文件扩展名
const filename = `${uniqueSuffix}${fileExtension}`; // 拼接新文件名
cb(null, filename);
}
});
// 配置multer中间件
const upload = multer({
storage: storage,
fileFilter: (req, file, cb) => {
// 检查文件类型,只接受特定的图片类型
if (file.mimetype.startsWith('image/')) {
cb(null, true);
} else {
cb(new Error('只能上传图片文件'));
}
}
});
module.exports = upload;
上述代码有两个部分,首先是路由调用中间件来处理表单提交的图片;其次就是中间件的部分,其中限制了图片的规格等,防止上传不符合要求的图片,否则抛出异常,返回给浏览器。