使用 Multer 和 nodejs 的图像未显示在文件夹中
Images not showing up in folder using Multer and nodejs
我有一个带有 Multer 的 nodejs 后端,用于将图像上传到名为 /uploads 的本地文件夹,之后,我将图像名称存储在我的 MySQL 数据库中。当我在本地主机上 运行 时,文件被上传到文件夹并且一切似乎都正常,但是在我将代码推送到 Heroku 之后,图像不再上传到文件夹。当我获取文件所在位置的 URL 时,我仍然可以访问该文件,但我看不到它。当我将新代码推送到 Heroku 时,因为图像不在文件夹中。我猜它被覆盖了。
任何人都可以向我解释为什么或如何?谢谢!
app.post('/api/register', upload.single('avatar'), function (req, res, next) {
pool.getConnection(async (err, connection) => {
if (err) throw err
console.log(req.file);
const username = req.body.username;
var password = req.body.password;
const email = req.body.email;
const picture = req.file.filename;
const salt = await bcrypt.genSalt();
password = await bcrypt.hash(password, salt);
connection.query(`INSERT INTO users (username, password, email, picture) VALUES (?,?,?,?)`,
[username, password, email, picture], (err, rows) => {
connection.release() // return the connection to pool
if (!err) {
console.log("insert succes");
res.send(`user with the record ID has been added.`)
} else {
console.log(err)
}
})
})
})
const storage = multer.diskStorage({
destination(req, file, callback) {
callback(null, './uploads');
},
filename(req, file, callback) {
callback(null, `${file.fieldname}_${Date.now()}_${file.originalname}`);
},
});
const upload = multer({ storage })
const app = express()
app.use('/uploads', express.static(process.cwd() + '/uploads'));
app.use(express.json());
app.use(cors());
正如在 link 的评论中提到的,因为 Heroku 更像是一个 'container' 所有存储都是短暂的(意味着它在 运行 容器上并且不是持久的)所以每次容器启动时,它只是将您的基本代码加载到 运行 图像中,仅此而已。当图像重新启动或重建时,它是一个新实例,并且在 运行 时添加的任何项目基本上都会丢失..
因此,除非您的应用程序是 'stateless',否则将需要将
之类的东西分开
会话
持久存储
幸运的是,这并不难设置。对于会话,您可能希望使用 Redis 之类的东西来存储会话信息,对于图像/资产,您可以使用 S3 或其他对象存储。 Multer 有一个很好的 s3 连接器(适用于任何 s3 兼容的对象存储),然后在您的数据库中您只需存储文件名并 return 它,使用 s3 url(media.example。 com/images/[图片]) 在您的应用程序中..
现在,对于你的问题.. 你应该仍然能够将文件上传到 运行 容器(除非权限阻止你)有一些用例确实有意义,例如它只是一个将在与请求等相同的线程中立即读取的临时文件
从你的代码来看,你似乎正试图上传到应用程序根上下文之外的 'uploads' 文件夹,所以我首先要确保你有一个 'uploads' 文件夹并且它有权限读/写,也是正确的所有者。如果出现错误,Node 应该会在控制台中给您一条错误消息,因此您需要通过 SSH 连接到 运行 heroku 实例以查看从那时起发生了什么。
我有一个带有 Multer 的 nodejs 后端,用于将图像上传到名为 /uploads 的本地文件夹,之后,我将图像名称存储在我的 MySQL 数据库中。当我在本地主机上 运行 时,文件被上传到文件夹并且一切似乎都正常,但是在我将代码推送到 Heroku 之后,图像不再上传到文件夹。当我获取文件所在位置的 URL 时,我仍然可以访问该文件,但我看不到它。当我将新代码推送到 Heroku 时,因为图像不在文件夹中。我猜它被覆盖了。
任何人都可以向我解释为什么或如何?谢谢!
app.post('/api/register', upload.single('avatar'), function (req, res, next) {
pool.getConnection(async (err, connection) => {
if (err) throw err
console.log(req.file);
const username = req.body.username;
var password = req.body.password;
const email = req.body.email;
const picture = req.file.filename;
const salt = await bcrypt.genSalt();
password = await bcrypt.hash(password, salt);
connection.query(`INSERT INTO users (username, password, email, picture) VALUES (?,?,?,?)`,
[username, password, email, picture], (err, rows) => {
connection.release() // return the connection to pool
if (!err) {
console.log("insert succes");
res.send(`user with the record ID has been added.`)
} else {
console.log(err)
}
})
})
})
const storage = multer.diskStorage({
destination(req, file, callback) {
callback(null, './uploads');
},
filename(req, file, callback) {
callback(null, `${file.fieldname}_${Date.now()}_${file.originalname}`);
},
});
const upload = multer({ storage })
const app = express()
app.use('/uploads', express.static(process.cwd() + '/uploads'));
app.use(express.json());
app.use(cors());
正如在 link 的评论中提到的,因为 Heroku 更像是一个 'container' 所有存储都是短暂的(意味着它在 运行 容器上并且不是持久的)所以每次容器启动时,它只是将您的基本代码加载到 运行 图像中,仅此而已。当图像重新启动或重建时,它是一个新实例,并且在 运行 时添加的任何项目基本上都会丢失..
因此,除非您的应用程序是 'stateless',否则将需要将
之类的东西分开会话 持久存储
幸运的是,这并不难设置。对于会话,您可能希望使用 Redis 之类的东西来存储会话信息,对于图像/资产,您可以使用 S3 或其他对象存储。 Multer 有一个很好的 s3 连接器(适用于任何 s3 兼容的对象存储),然后在您的数据库中您只需存储文件名并 return 它,使用 s3 url(media.example。 com/images/[图片]) 在您的应用程序中..
现在,对于你的问题.. 你应该仍然能够将文件上传到 运行 容器(除非权限阻止你)有一些用例确实有意义,例如它只是一个将在与请求等相同的线程中立即读取的临时文件
从你的代码来看,你似乎正试图上传到应用程序根上下文之外的 'uploads' 文件夹,所以我首先要确保你有一个 'uploads' 文件夹并且它有权限读/写,也是正确的所有者。如果出现错误,Node 应该会在控制台中给您一条错误消息,因此您需要通过 SSH 连接到 运行 heroku 实例以查看从那时起发生了什么。