Я использую пакет CollectionFS с адаптером S3, и я рассмотрел несколько различных решений, но не могу заставить это работать правильно.Meteor CollectionFS: убедитесь, что изображение загружено перед отображением
Проблема: Несмотря на то, что файл/изображение загружается на S3 успешно, обратный вызов для успешной загрузки запускается, прежде чем безопасно отображать изображение. Это приводит к тому, что иногда отображается некорректное изображение.
Я узнал о обратном вызове fileObj.once("uploaded", function(){})
, но, кажется, «загруженный» в основном означает отправку изображения на сервер. К тому времени загрузка S3 не произойдет. Временное обходное решение, которое я нашел, состоит в том, чтобы просто иметь setTimeout
в течение 3-4 секунд, но это ненадежно.
Вот мой код загрузки:
FS.Utility.eachFile(event, function(file) {
Session.set('profilePhotoUploaded', false);
var newFile = new FS.File(file);
newFile.metadata = {owner: Meteor.userId()};
ProfileImages.insert(newFile, function (err, fileObj) {
if (err){
console.log("error! - " + err);
} else {
// handle success depending what you need to do
var userId = Meteor.userId();
// This does NOT run when image is stored in S3. I think it runs when the image reached the app server.
fileObj.once("uploaded", function() {
// timeout of 3 seconds to make sure image is ready to be displayed
// --- This is not a good solution and it image does is not always ready
setTimeout(function(){
var uploadedImage = {
"profile.image.url": "/cfs/files/profileImages/" + fileObj._id
};
Meteor.users.update(userId, {$set: uploadedImage});
Session.set('profilePhotoUploaded', true);
}, 3000);
console.log("Done uploading!");
});
}
});
});
Есть другой обратный вызов, чтобы проверить, если изображение на самом деле было сохранено в S3? Я пробовал fileObj.once("stored", function(){})
, но это не работает.
Это отстой, что на клиентской стороне еще нет обратного вызова, чтобы сообщить приложению, что файл был сохранен безопасно, но этот код нужно будет сделать сейчас. Благодаря! –