无法在 Heroku 服务器上上传图片
Can't upload images on Heroku server
将图像上传到 heroku 服务器时出现问题,在本地主机上一切正常。但是在 heroku 上,当我上传图片时,看起来一切顺利,但是在刷新页面后我收到错误消息 404(未找到),所以它似乎没有上传。
这是我的代码
var express = require('express'),
app = express(),
server = app.listen(process.env.PORT || 5000),
fs = require('fs-extra'),
im = require('imagemagick'),
util = require('util'),
formidable = require('formidable');
app.post('/upload', function (req, res){
var form = new formidable.IncomingForm();
// show respond
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
console.log(fields + ' ' + files);
res.end(util.inspect({fields: fields, files: files}));
});
form.on('end', function(fields, files) {
var that = this;
// temporary storage of image
var temp_path = that.openedFiles[0].path;
// uploaded image name
var file_name = that.openedFiles[0].name;
var dirpath = __dirname + '/app';
var opt = {
thumb : {
width: 150,
height: 150,
dest: '/uploads/thumbnails/'
},
original : {
dest : '/uploads/original/'
}
};
// get extension of image
var extension;
(function(type) {
if (type == 'image/jpeg' || type == 'image/jpg') {
extension = '.jpg';
} else if (type == 'image/png') {
extension = '.png';
}
})(that.openedFiles[0].type);
fs.copy(temp_path, dirpath + opt.original.dest + id + extension, function(err) {
if (err) {
console.error(err);
} else {
// thumbnails
im.crop({
srcPath: dirpath + opt.original.dest + id + extension,
dstPath: dirpath + opt.thumb.dest + id + extension,
width: opt.thumb.width,
height: opt.thumb.height,
quality: 1,
gravity: 'Center'
}, function (err, stdout, stderr){
if (err) {console.log('Thumbnail is not generated')}
else {
}
});
}
});
});
});
哪里有问题?
在云环境中,您永远不应将图像上传到实例本身。始终使用中央存储(例如 S3)来存储您上传的文件。
当您在云环境中开发时,您应该始终牢记您当前所在的盒子 运行 您的代码只会存在一定的时间(分钟、小时)。因此,如果实例出现故障,您将丢失所有上传的文件。
例如,当您有 2 个实例并且您的用户将图像上传到实例 x 时,可能会出现另一个问题。现在,当第二个用户尝试查看图像但负载均衡器将请求发送到实例 y 时,找不到图像,因为该实例上不存在该图像。
为了调试您的脚本,我会添加更多日志记录。然后在 Heroku 中你可以使用 :
heroku logs -t -a appname
查看您的应用程序的日志。
将图像上传到 heroku 服务器时出现问题,在本地主机上一切正常。但是在 heroku 上,当我上传图片时,看起来一切顺利,但是在刷新页面后我收到错误消息 404(未找到),所以它似乎没有上传。
这是我的代码
var express = require('express'),
app = express(),
server = app.listen(process.env.PORT || 5000),
fs = require('fs-extra'),
im = require('imagemagick'),
util = require('util'),
formidable = require('formidable');
app.post('/upload', function (req, res){
var form = new formidable.IncomingForm();
// show respond
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
console.log(fields + ' ' + files);
res.end(util.inspect({fields: fields, files: files}));
});
form.on('end', function(fields, files) {
var that = this;
// temporary storage of image
var temp_path = that.openedFiles[0].path;
// uploaded image name
var file_name = that.openedFiles[0].name;
var dirpath = __dirname + '/app';
var opt = {
thumb : {
width: 150,
height: 150,
dest: '/uploads/thumbnails/'
},
original : {
dest : '/uploads/original/'
}
};
// get extension of image
var extension;
(function(type) {
if (type == 'image/jpeg' || type == 'image/jpg') {
extension = '.jpg';
} else if (type == 'image/png') {
extension = '.png';
}
})(that.openedFiles[0].type);
fs.copy(temp_path, dirpath + opt.original.dest + id + extension, function(err) {
if (err) {
console.error(err);
} else {
// thumbnails
im.crop({
srcPath: dirpath + opt.original.dest + id + extension,
dstPath: dirpath + opt.thumb.dest + id + extension,
width: opt.thumb.width,
height: opt.thumb.height,
quality: 1,
gravity: 'Center'
}, function (err, stdout, stderr){
if (err) {console.log('Thumbnail is not generated')}
else {
}
});
}
});
});
});
哪里有问题?
在云环境中,您永远不应将图像上传到实例本身。始终使用中央存储(例如 S3)来存储您上传的文件。
当您在云环境中开发时,您应该始终牢记您当前所在的盒子 运行 您的代码只会存在一定的时间(分钟、小时)。因此,如果实例出现故障,您将丢失所有上传的文件。
例如,当您有 2 个实例并且您的用户将图像上传到实例 x 时,可能会出现另一个问题。现在,当第二个用户尝试查看图像但负载均衡器将请求发送到实例 y 时,找不到图像,因为该实例上不存在该图像。
为了调试您的脚本,我会添加更多日志记录。然后在 Heroku 中你可以使用 :
heroku logs -t -a appname
查看您的应用程序的日志。