2016-07-17 1 views
2

junkery-file-upload-middleware 및 mongoDB와 함께 express.js에서 jQuery File Upload를 사용하고 있습니다.jQuery 파일 업로드에서 모든 파일을 업로드 할 때 서버 측에서 stop 이벤트를 사용하는 방법

갤러리의 이미지를 업로드하고 싶습니다. Galery 객체는 이미지 객체의 배열과 같은

var GalerySchema = new mongoose.Schema({ 
    images: [ImageSchema] 
}) 

각 파일을 비동기 적으로 업로드 한 후, 나는 내 galery 개체의 이미지 배열로 밀어 원하는 포함되어 있습니다. 이후, 나는 잘 [VersionError: No matching document found.] 알려진 얻을, 즉, 내 현재의 지식으로, 같은 MongoDB를 문서의 동시 액세스로 인해,

// Is called everytime an image is uploaded 
upload.on('end', function(fileInfo, rew, res){ 
    // Get the galery 
    db.Galery.findOne({_id: req.fields.galery_id}, function(err, galery){ 

     // Create new Image object instance 
     var image = new db.Image({src: fileInfo.name}); 

     // Save, in order to create auto generated _id 
     image.save(function(err){ 
      if(err) {console.log(err); return; } 

      // Add to Images array of Galery object 
      galery.images.push(image); 

      // Save galery with added image 
      galery.save(function(err){ 
       if(err) { console.log(err); return; } 
      }); 
     }) 
    }); 
}); 

그 일 :

나는 다음과 같은 서버 측을하려고 노력 업로드가 비동기 적으로 발생합니다.

문제의 비동기 방식을 처리하려면 모든 업로드가 완료 될 때까지 기다린 다음 mongodb에 이미지를 하나씩 삽입하는 것, 즉 async.parallel()을 사용하는 것이 좋습니다.

하지만 업로드가 완료된 모든 일정에 어떻게 액세스합니까?

나는 브라우저 측에서 stop event을 사용할 수 있음을 알고 있습니다. 하지만 먼저 업로드 된 파일에 대한 데이터가 없습니다. 또한, 나는 그것을 서버 측에서하고 싶다. (: NPM은 블루 버드 --save를 설치 https://github.com/petkaantonov/bluebird 블루 버드)와 같은 것을 가지고

upload.on('doneAll', function(allFilesInfo, req, res){...})? 
+0

'res'를 사용해 보셨습니까? 'res.end ('Uploaded')' – Mornor

+0

jQuery 파일 업로드 속성에서 순차적으로 업로드하기 위해'sequentialUploads : true'를 설정하여 해결 방법을 찾았습니다. 하지만 비동기식으로하는 방법을 알고 싶습니다. – Flaudre

+0

업로드 된 이미지를 가져 오기 위해 어떤 라이브러리를 사용하고 있는지 잘 모르겠습니다. 마지막 이미지의 upload.on ('end')이 언제 호출되는지 알 필요가 있습니다. 어쨌든 알 수 있습니까? –

답변

0
당신은 약속을 사용할 수

같은 뭔가가 있나요

var BPromise = require('bluebird'); 

var uploadDone = new BPromise(function (resolve, reject) { 

    // your image upload 

}); 

uploadDone.then(function (result) { 

    // upload complete here 

}, function (error) { 
    console.log("Error: ", error); 
}); 
+1

이것은 OP가 어떤 것을 알고 싶어 하는지를 결정할 때 언제 ** ** 문제를 해결하지 못합니다. – Will

0

이후의 jQuery 파일 업로드 각 파일에 대한 XHR을 만들고 있는데, 이는 서버 측에서 별도의 POST로 간주되며 모든 업로드가 완료된 시점을 업로드 미들웨어가 직접 알 수있는 방법은 없습니다. stop 이벤트에 대한 콜백으로 히트 할 다른 끝점을 만들 수도 있지만 이미 알고있는 것처럼 업로드 된 내용에 대한 정보가 부족할뿐만 아니라 두 명 이상의 사용자가 업로드하는 경우 많은 도움이되지 않습니다. 동시에.

Galery에서 업데이트를 수행하려면 findOneAndUpdate (또는 findByIdAndUpdate) 전화를 사용해야합니다. $pushimage ~ galery의 예는 answer을 참조하십시오.

0

업로드시 파일 당 서버 한 번 요청하거나 sequentialUploads: true을 사용하는 경우 총 하나의 요청을 수행합니다. 비동기식 시나리오에서 모든 이미지를 언제 업로드했는지 알고 싶으면 express로 추가 라우트를 정의하고이 라우트를 호출하는 모든 파일이 완료되면 파일 업 로더에 콜백을 추가해야합니다. 그런 다음 업로드 한 파일과 이전에 저장하지 않은 파일을 추적해야합니다. 둘 이상의 사람 (공용 액세스?)이 스크립트를 사용하는 경우 "uploadDone"경로가 호출 될 때 추가 할 업로드 파일을 저장하기 위해 세션 처리를 구현해야합니다. 오버 헤드가 많아서 sequentialUploads: true 솔루션을 사용하는 것이 좋습니다.

그러나 문서를 가져 오거나 저장하는 것이 몇 밀리 초가 걸리기 때문에 갤러리 문서에 동시에 액세스 할 수 있기 때문에 [VersionError: No matching document found.]을 얻는다고 거의 믿지 않습니다. 이 전송되었는지 확인하라고 조언합니다.

console.log(req.fields.galery_id); 
관련 문제