2013-11-23 56 views
0

我有一個play應用程序。我在服務器端使用play-resplay-scalr庫進行圖像大小調整。 當我用圖像文件進行多部分表單提交時。在服務器端,我只在Windows系統上不在mac上獲得以下異常。apche commons movefile方法在windows中失敗

堆棧跟蹤

Caused by: java.io.IOException: Failed to delete original file 'E:\tmp\multipartBody677849053220396275asTemporaryFile' after copy to 'E:\work\projects\rismus\res\profile\268d\3a0d\268d3a0d9a36e7cc8b826b274de4aaa47fdc6591.jpg' 
    at org.apache.commons.io.FileUtils.moveFile(FileUtils.java:2835) ~[commons-io.jar:2.4] 
    at se.digiplant.res.api.Res$.put(Res.scala:81) ~[play-res_2.10-1.0.1.jar:1.0.1] 
    at se.digiplant.res.api.Res$.put(Res.scala:117) ~[play-res_2.10-1.0.1.jar:1.0.1] 
    at controllers.ImageUploader$$anonfun$upload$2$$anonfun$apply$1$$anonfun$apply$2$$anonfun$1.apply(ImageUploader.scala:37) ~[na:na] 
    at controllers.ImageUploader$$anonfun$upload$2$$anonfun$apply$1$$anonfun$apply$2$$anonfun$1.apply(ImageUploader.scala:36) ~[na:na] 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na] 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) ~[scala-library.jar:na] 
    at scala.collection.immutable.List.foreach(List.scala:318) ~[scala-library.jar:na] 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) ~[scala-library.jar:na] 
    at scala.collection.AbstractTraversable.map(Traversable.scala:105) ~[scala-library.jar:na] 
    at controllers.ImageUploader$$anonfun$upload$2$$anonfun$apply$1$$anonfun$apply$2.apply(ImageUploader.scala:36) ~[na:na] 
    at controllers.ImageUploader$$anonfun$upload$2$$anonfun$apply$1$$anonfun$apply$2.apply(ImageUploader.scala:26) ~[na:na] 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library.jar:na] 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library.jar:na] 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42) ~[akka-actor_2.10.jar:2.2.0] 
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) ~[akka-actor_2.10.jar:2.2.0] 
    ... 4 common frames omitted 

讓我知道,如果它需要更多的信息來理解這個問題。

編輯:上傳功能

def upload(accountId: Long): EssentialAction = Authenticated(
    account => Action.async(parse.multipartFormData) { request => Future { 
     if (account.id != accountId) Results.Unauthorized 
     else { 

      if (request.body.files.filter(f => !checkFileType(f)).length > 0) { 
      BadRequest("Unsupported file type") 
      } else { 

      val assets = request.body.files.map { file => 
       val assetId = Res.put(file, source, Seq.empty) //fails here 
       Map("asset_id" -> assetId, "mime" -> file.contentType.get) 
      } 

      if (assets.length == 0) BadRequest("No Images uploaded") 


      DB.withConnection { implicit c => 
       assets.foreach { asset => 
        Accounts.updatePicture(accountId, asset("asset_id")) 
       } 
      } 

      Ok(Json.toJson(assets)) 

      } 
     } 
     } 
    }, 
    failedResult = Results.Unauthorized 
) 
+0

嗨!我是play-res和play-scalr的創造者。我很抱歉,但我沒有一臺Windows機器來測試它。由於我使用apache commons來完成繁重的工作,移動複製文件,它看起來像是在那裏。讓我知道是否有什麼我可以做,讓它消失:) –

回答

0

在Windows中的文件,而他們是開放的,不能被刪除被鎖定。在Unix/Linux上,通常可以在打開時刪除文件(除非涉及到網絡文件系統) - 該文件仍然存在於磁盤上,仍佔用空間,直到其最後一個文件描述符被關閉,但與目錄分離,因此它是不可見。

所以問題是臨時文件尚未關閉。

+0

好吧,得到它,你可以請建議這是什麼解決方案,我怎麼能在刪除之前關閉臨時文件。 – pankajmi

+0

@pankajmi我看了看源代碼,發現沒有錯誤。所以也許這個錯誤在你的代碼中,或者你正在使用一個不同版本的bug。無論哪種方式,更多細節將會有所幫助。 –

+0

我正在使用版本play-scalr 1.0.1,並根據[提交歷史](https://github.com/digiPlant/play-scalr/commits/)這似乎是最新的。我用更多的代碼編輯了我的問題 – pankajmi