2015-02-12 4 views
3

У вас возникли проблемы с загрузкой изображений на сервер heroku, на localhost все отлично работает. Но на герою, когда я загружаю изображение, кажется, что все идет хорошо, но после обновления страницы у меня появилось сообщение об ошибке 404 (Not Found), поэтому кажется, что он не загружен.Не удается загрузить изображения на сервере Heroku

Вот мой код

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 { 
      } 
     }); 
     } 
    }); 
    }); 
}); 

Где может быть проблема?

ответ

4

В облачной среде вы никогда не должны загружать изображения в экземпляр самостоятельно. Всегда используйте центральное хранилище, например, S3 для хранения загруженных файлов.

Когда вы работаете в облачной среде, вы всегда должны помнить, что текущее поле, в котором вы работаете, будет жить только в течение определенного количества времени (минут, часов). Поэтому, если экземпляры не работают, вы потеряете все загруженные файлы.

Другая проблема может возникнуть, если вы, например, имеете 2 экземпляра, и ваш пользователь загружает изображение, чтобы установить x. Теперь, когда второй пользователь пытается просмотреть изображение, но балансировщик нагрузки отправит запрос экземпляру y, изображение не будет найдено, потому что оно не существует в этом экземпляре.

Для отладки вашего сценария я бы добавил еще несколько журналов. Затем в Heroku вы можете использовать:

heroku logs -t -a appname 

посмотреть журналы вашего приложения.

Смежные вопросы