2014-01-18 53 views
3

这实际上更像是一种“使用什么方法”而不是“如何做”的问题。我正在使用Express在NodeJS中创建一个站点。因此,每个用户都有能力上传profile picture,我的担心是如何为这些图像发送请求。我有几个问题是:如何在节点中提供静态配置文件图像

  • 如果未指定有效的文件,我可以使用express.static()来提供默认文件吗?如果没有,我需要为/img/profile指定GET路由并处理FS查询吗?

  • 如果允许多个文件扩展名,我怎么才能找到正确的图像? (我最初只是删除了文件扩展名,并且它们出现在img标签中,是吗?)

  • 我目前命名所有图片都是用户名后面的。展望未来(对于可能需要扩展的应用程序),静态用户内容的常规命名约定是什么?大部分存储在引用数据库内容的UUID中?

  • 还有什么我应该考虑的,我可能还没有考虑过呢?

回答

3

第一个问题:

目前,我建议你存储,可以从列或字段的组合在数据库中的条目来推断预测的位置,你的图像。其中一个字段或列将是一个文件名(占不同的扩展名)。然后,如果他们没有上传图片,则只需在视图代码中放置一个对通用“未设置图片”文件的引用即可。

express.static明显可以服务器静态文件,但它目前没有办法满足一些其他的文件,如果你爱的人是不存在的。因为这听上去很不错,我做了一些修改,以static支持你的要求是什么,并提交了几个拉请求(地物触及2个不同的模块):

我不知道如果这些将获得包含在项目中,但如果你想看到我的叉子有这些变化,他们在这里:

如果这个经历,你将登上一个静态的,在您的个人资料的图像文件的根目录:

app.use(static('<profile image files root>', { fallback: 'anon.jpg'}))

第二个问题

我一般将扩展存储在我的数据库中,然后在加载图像时,我有正确的扩展名放入img标记的src属性中。

第三个问题

如果你能保证唯一的名称,然后使用这些会工作。我建议使用DB ID或UUID。扫描所有图像上传时,它不那么直观,但我很少发现自己在这样做。我通常寻找一个特定的图像,我可以根据需要查找标识符。

四问题

你可能最终存储(例如,在S3)你的应用服务器以外的静态内容。如果发生这种情况,当然static不会帮助你。

+1

我已经感觉更接近正确的道路。感谢真棒信息! – Kyle

+0

很高兴帮助。而FWIW,项目维护人员不同意我的方法并拒绝PR。 :)他们是聪明的人,所以它可能值得考虑他们的评论。快乐的编码! – juanpaco