2012-07-01 107 views
0

我試圖用Play 2同時加載多個文件,併爲它們構建一些縮略圖,並使用異步API。 上傳工作非常好,圖像處理開始時會遇到很大的麻煩。 問題如下(有點說明):從圖像處理(花費大量時間),從請求中提取並收集到列表中的文件正在消失。Play Framework 2.多文件上傳和處理

而且一些樣品在這裏:

//part of controller 
public static Result addPictures2(Long galleryId) { 


     MultipartFormData body    = request().body().asMultipartFormData(); 
     final List<FilePart> fileList  = body.getFiles(); 
     final Long fGalleryId    = galleryId; 

     Promise<Boolean> promiseOfBool = Akka.future( 
       new Callable<Boolean>() { 
        public Boolean call() { 

         Gallery gallery = Gallery.find.byId(fGalleryId); 

         for(FilePart part : fileList) { 
          File picFile  = part.getFile(); 
          Logger.debug("picFile: " + picFile.exists()); 
          String extension = FilenameUtils.getExtension(part.getFilename()); 
          GalleryItem item = new GalleryItem("", "", picFile, extension); 
          gallery.addItem(item); 
         } 

         gallery.update(); 
         return true; 
        } 
       } 
     ); 



     return async(
      promiseOfBool.map(
       new Function<Boolean, Result>() { 
        public Result apply(Boolean b) { 
         return redirect(
           controllers.backend.routes.GalleryContentController.showGalleryItemsPage(fGalleryId) 
          ); 
        } 
       } 
      ) 
     ); 


    } 

所以

gallery.addItem(項目);

需要花費大量的時間,並且下一個呼叫爲

Logger.debug( 「picFile:」 + picFile.exists());

說picFile不存在。我知道,這是因爲這些文件是臨時的......但是它們應該存在多久?問題是:如何解決這個問題。我應該看看java中的臨時文件嗎?

回答

0

看起來解決方案非常簡單。我應該將文件保存在自己的緩存中,直到我在Akka工作人員中使用它們。經過Akka處理後,我可以自己刪除它。 這種行爲的原因不是浪費文件描述符。在Akka開始之前,從請求中提取的文件將被刪除。無論如何,這只是一個猜測。我現在就試一試。

P.S.是。有一個問題。解決方案是將這些文件保留爲臨時文件並僅在處理後刪除。

+1

經常會詢問文件上傳問題,您能否更新問題並添加適合您的解決方案的正確代碼? – adis