我有这个上传照片:
module.exports = function (req, image, url, callback) {
var filename = (Math.floor((Math.random() * 100000000000) + 1)) + ".png";
req.file(image).upload({
dirname: '../../assets/images' + url
,
saveAs: function(file, cb) {
cb(null, filename);
}
}, function(error, uploadedFiles) {
return callback(null, "http://" + req.headers.host + "/images" + url + filename)
});
}
它返回一个这样的网址:http://localhost:1349/images/dependent/photos/30363010266.png
我可以看到我的照片已上传到项目文件夹中,因为我是在物理上看到的。但是URL不起作用,并且看起来没有找到错误。
如果我重新启动服务器,则URL工作正常。
谢谢!
答案 0 :(得分:5)
正如@Eugene Obrezkov指出的那样,您的问题与您上传图片的位置和咕噜咕噜的任务选手有关。所有资产都从该文件夹(/assets
)复制到.tmp
,并且grunt任务运行程序会监视更改,但这不会包含新的图像文件(如果您要访问资产文件夹中的空文件夹,在您的情况下为图像文件夹)。因此解决方案非常简单,您必须直接上传到.tmp
文件夹,最好是.tmp/public/uploads/year/month/
,您可以根据需要选择路径。现在使用这种方法有一个警告,并且有一个 grunt任务清除在风帆升降机上.tmp
文件夹的内容,所以你将产生相反的效果,现在为了避免这种情况也很容易,您必须编辑clean.js
任务以删除特定文件夹,以避免删除您的上传文件夹。
转到项目文件夹tasks/config/clean.js
,并替换此代码中的内容,或根据需要进行修改。
module.exports = function(grunt) {
grunt.config.set('clean', {
dev: [
getFolderPath('fonts/**'),
getFolderPath('images/**'),
getFolderPath('images/**'),
getFolderPath('js/**'),
getFolderPath('styles/**'),
getFolderPath('*.*')
],
build: ['www']
});
grunt.loadNpmTasks('grunt-contrib-clean');
};
function getFolderPath(folderName){
return '.tmp/public/' + folderName;
}
现在,您的上传内容会立即显示给最终用户,而不会重新启动,重新启动也不会删除这些上传内容。在尝试上传之前,请确保.tmp/public/uploads/
路径存在,或者如果找不到则使用mkdir
通过代码创建路径。
还有其他解决方案,比如确保在服务器启动时或者使用符号链接时,您要上传到的文件夹中至少有一个文件,但我认为这是一种更简洁的方法。您可以在此处查看这些选项:
答案 1 :(得分:4)
如果您查看tasks
文件夹,可以找到将所有assets
文件夹复制到.tmp
文件夹并将.tmp
文件夹作为静态公用文件夹复制的Grunt任务
当您运行Sails应用程序时,它会运行这些Grunt任务,因此,如果您将文件直接上传到assets
文件夹,则在重新运行服务器和Grunt任务之前将无法访问它。
解决方案?没有解决方案。基本上,你做错了。最佳做法是将图像\文件\存储在S3存储桶,谷歌存储,至少是另一个硬盘驱动器上,而不是assets
本身。因为它是您项目的源文件,并且应该只找到项目本身所需的文件,而不是用户的文件等......
答案 2 :(得分:0)
你可以在不修改任何grunt任务的情况下实现。我有同样的问题,我刚解决了。
我看到你已经对其他评论中发生的事情有了解释,所以我会直接找到我的解决方案。我将文件上传到.tmp文件夹,在上传的回调中,我使用文件系统将它们转移到assets文件夹(fs-extra是一个很棒的包)。
所以现在我可以在添加后立即看到我的UI中的图像(因为我将它们上传到.tmp),当我的服务器停止时,.tmp将会丢失,但会在下一次升降时再次生成并复制文件资产。
希望它有所帮助!
答案 3 :(得分:0)
这就是我解决这个问题的方法。答案需要几个步骤。我假设您要将最近上传的图像放在名为users的文件夹中。
<强>步骤:强>
1. npm install express --save
(如果你没有安装它)
在您的应用根目录中创建用户文件夹。
打开文本编辑器并查看以下文件config\express.js
添加或替换代码 ` var express = require(&#39; express&#39;); module.exports.http = { customMiddleware:function(app){ app.use(&#39; / users&#39;,express.static(process.cwd()+&#39; / users&#39;)); } };
` 5.确保新上传的图像放在用户文件夹
中