2016-05-30 3 views
1

Я использую Экспресс 4.13, и я встретил некоторые проблемы, когда я пытался служить файлы:res.sendFile не работает

function doServeFile(name, fullpath, res, download) { 
    if (fullpath) { 
     if (download) 
      res.download(fullpath, name); 
     else { 
      res.sendFile(fullpath, {}, function (err) { 
       console.info(err); 
      }); 
     } 
    } 
    else { 
     res.status(404); 
    } 
} 

function serveFile(id, res, download) { 
    Model.findById(id).then(file=> { 
     var fullPath = Config.uploadDest + "/" + file.path; 
     doServeFile(file.filename, fullPath, res, download) 
    }).catch(Util.dbErrorHandler); 
} 
router.get("/:id", function (req, res, next) { 
    serveFile(req.params.id, res); 
}); 
router.get("/download/:id", function (req, res, next) { 
    serveFile(req.params.id, res, true); 
}); 

как коды показанный после того, как я отправить запрос /1 на сервер, его будет извлекать файл с идентификатором 1, чтобы получить путь к файлу, а затем использовать res.sendFile для обслуживания файла клиенту.

Однако, когда я запускаю приложение, я обнаружил, что запрос будет слишком долго зависать, чтобы получить ответ. Но я могу видеть, как это журналы:

---try send file:D:/file_upload/1464578330791_user.jpg

Похоже, что файл был неправдоподобным, но res.sendFile не завершит свою работу.

Кроме того, когда я попробовал /download/1, файл можно скачать.

Что происходит?

+1

'res.sendFile() поддерживается Экспресс v4.8.0 onwards' http://expressjs.com/ru/api.html#res.sendFile – dcodesmith

+0

Переменная 'id' в вашем маршруте не определена. Вы отправляете полный код? Кроме того, 'fullpath' в' doServeFile' будет _allways_ оцениваться как true, потому что вы префикс его с 'Config.uploadDest + '/" '. – robertklep

+0

@robertklep: Мой очерк, идентификатор не определен. И, как я уже сказал, я вижу полный путь к файлу в журнале. – hguser

ответ

0

У меня была эта же проблема на днях и нашлось, что sendFile фактически не признает абсолютные пути правильно и зависает. Установка опции root решила проблему. Надеюсь, это может сработать для вас.

res.sendFile(fullpath, {root: '/'}); 
+0

Это вещь Windows?Абсолютные пути для меня просто отлично (OS X). – robertklep

+0

Для меня это произошло в Alpine и, возможно, Debian, если я правильно помню. –

+0

Хм, странно, я не могу воспроизвести его на Debian или Ubuntu. – robertklep

0

После того, как вы нашли исходные коды экспресс-доставки, я нашел ответ.

Когда res.sendFile называется, экспресс будет, чтобы убедиться, что root пути устанавливается или путь должен быть абсолютный путь, проверьте this, это просто isAbsolutepath, которые вызывают эту проблему, codes:

exports.isAbsolute = function(path){ 
    if ('/' == path[0]) return true; 
    if (':' == path[1] && '\\' == path[2]) return true; 
    if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path 
}; 

так путь, как

D:/a/a.txt не будет рассматриваться как абсолютный путь!

D:\\a\\a.txt будет. И так же похож на Linux-путь /home/a/a.txt.

И это, как я построить путь (вручную), который не является абсолютным путем с точки зрения Express в:

var fullPath = Config.uploadDest + "/" + file.path; 

Так что я изменить его:

var fullPath = path.join(Config.uploadDest,file.path); 

Он работал.

0

Если вы используете окна операционной системы, используйте полный путь, такой как

D: /folder1/folder2/index.html

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