在我的网络上,有一个目录,我们存储了许多大图像。从我的风帆应用程序,我希望能够显示它们。 Web服务器与"图像存储"不是同一个框。地点。所以我需要在assets文件夹之外显示图像。我怎样才能做到这一点? 我不在乎控制器操作是否会通过文件名手动获取图像,或者是否存在某种虚拟路由以在应用程序中创建指向其他位置的位置。只需知道如何。我无法在网上找到任何东西。
答案 0 :(得分:0)
这里有一个我的例子。希望我理解正确:
attachments: function(req, res) {
if(req.method === 'GET') {
var params = req.params.all();
var filePath = [process.cwd(), '../yourpath/', params.filename].join('/');
var stat = fs.statSync(filePath);
var readStream = fs.createReadStream(filePath);
readStream.pipe(res);
}
},
基本上,您可以从任何路径获取文件。点击/controller/attachments/file.jpg后,此函数将返回图像。
警告:正如@Liam所述,“这有一些严重的安全风险 在params.filename中使用../,因为他们现在可以下载每个文件 你的服务器具有全局读权限。“所以采取一切措施 您需要采取预防措施以避免这种情况。
答案 1 :(得分:0)
有两种标准方法可以做到这一点。首选/更高效的方法是设置反向代理以提供静态文件(并且可以为不同的服务器配置不同的路由)。
首选的是配置你的Apache或nginx反向代理,以便某个url(比如/assets/images/<custom-folder>
直接服务于目录,而不是通过Nodejs代理。这更有效,因为Apache / nginx守护进程是在提供文件时比Node快得多。
[nginx config example inbound]
请参阅问题:Serving static files from iisnode with URL Rewrite
我没有设置IISNode的经验,但从它的外观来看,你可以让它提供静态文件,而不是让Sails.js提供文件,这样你就可以为不同的文件夹配置不同的路由。下面是一个提供静态文件的IISNode配置示例,我想你可以为不同的文件夹设置多个静态和静态服务重写规则。
<system.webServer>
<handlers>
<clear />
<add name="iisnode" path="/index.js" verb="*" modules="iisnode" />
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>
<rewrite>
<rules>
<rule name="static">
<action type="Rewrite" url="www{REQUEST_URI}" />
</rule>
<rule name="serve-static" stopProcessing="true">
<conditions logicalGrouping="MatchAny">
<add input="{REQUEST_FILENAME}" matchType="IsFile" />
<add input="{REQUEST_URI}" pattern="^/www/$" />
</conditions>
</rule>
<rule name="node">
<action type="Rewrite" url="index.js" />
</rule>
</rules>
</rewrite>
</system.webServer>
另一种(更简单的)方法是对Sails.js资产目录中的文件夹进行符号链接,然后通过常用的Sails.js路由进行处理。要设置符号链接:
cd <assets-dir>
ln -s <full-path-of-large-images-dir> <folder-name>
例如:
cd assets/images
ln -s /var/images/large large
然后您将有一个指向assets/images/large
目录的文件夹/var/images/large
。