2015-06-22 2 views
4

Я работаю над API NodeJs, и я решил использовать GridFS для хранения и загрузки файлов. У меня есть два API для этого: загрузка и загрузка. Оба API работают отлично, когда я их называю, используя Postman; однако у меня проблема с загрузкой файлов с помощью браузера. Кажется, браузер видит 200 HTTP-код и ожидает, что файл будет там сразу, пока контент по-прежнему будет транслироваться. Следовательно, он жалуется, что изображение или PDF или т. Д. Имеет ошибку или имеет неверный формат. Единственный тип файла, который работает, - это MP3, для которого браузер запускает плагин для потоковой передачи MP3, который воспроизводит эту музыку.Проблема с загрузкой файла из GridFS в файле MongoDB/NodeJs/GridFS

var Grid = require('gridfs-stream'); 
Grid.mongo = mongoose.mongo; 
var gfs = new Grid(mongoose.connection.db); 
//.... some code in here 
exports.download = function(req, res) { 
    gfs.files.find({ "_id": mongoose.Types.ObjectId(req.params.id) }).toArray(function (err, files) { 
      if(files.length===0){ 
      return res.status(400).send({ 
       message: 'File not found' 
      }); 
      } 



     var readstream = gfs.createReadStream({ 
       filename: files[0].filename 
     }); 

     readstream.pipe(res); 
    }); 
}; 

Я использовал Fiddler поймать запрос и ответ:

Это запрос:

GET http://localhost:9000/api/file/download/5586fd1a04de649c4eff2223?access_token=bluhbluhbluhbluhbluh HTTP/1.1 
Host: localhost:9000 
Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,fa;q=0.6 
Cookie: _ga=xxxxxxxxxxxxx; wp-settings-1=editor%3Dhtml%26align%3Dleft%26unfold%3D1%26mfold%3Do%26hidetb%3D1; wp-settings-time-1=1434314682; session_id=xxxxxxxxxxxxxxxxx; connect.sid=xxxxxxxxxx; token=xxxxxxxxxx 

и это ответ:

HTTP/1.1 200 OK 
X-Powered-By: Express 
content-length: 2412930 
Date: Mon, 22 Jun 2015 16:45:04 GMT 
Connection: keep-alive 

%PDF-1.4 
%  
< The rest of PDF content comes in here > 

Любые идеи, как я могу почини это?

+0

Это очень удивительно, если вы не видите никаких действий здесь даже с помощью баунти. – Aidin

+0

Можете ли вы сделать PDF/изображения загруженными в GridFS в правильном формате? Запись данных Gridfs в файл и посмотреть, можете ли вы их открыть? – hassansin

+0

Тот же вопрос для меня. Я использовал mongofiles и проверил md5sum, и я могу подтвердить, что они отлично загружаются в GridFS. Но через браузер он становится поврежденным некоторыми способами, которые я не могу понять. – Chinni

ответ

1

Похоже, проблема связана с типом MIME. Добавьте модуль узла мима и попробуйте следующее:

//Get Readstream code here 
var mimetype = mime.lookup(files[0].filename); 

res.setHeader('Content-disposition', 'attachment; filename=' + files[0].filename); 
res.setHeader('Content-type', mimetype); 

readstream.pipe(res); 

Вы можете также установить mimetype к application/pdf, чтобы проверить это с PDF-файлом, первым.

+1

Позвольте мне проверить это сегодня вечером и вернуться к вам с результатами. Спасибо – Aidin

+0

У меня нет возможности проверить это, поэтому я не знаю, является ли это решением или нет. Я предоставил вам крошку только потому, что крошка истекала и, по крайней мере, пыталась ответить на вопрос. Я проверю код и дам вам знать, работает ли он. – Aidin

+0

Я уверен, что это решение, но если он по какой-то причине не работает, мы можем настроить чат и устранить неполадки в удобное для вас время. –

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