2013-10-15 34 views
1

我試圖從一個「多/表單數據」的形式上傳多個文件,並把它們都存儲在一個批次ID文件夾(這僅僅是一個時間戳)多個上傳控制器/斯卡拉

問題是我目前只能保存一個文件。

查看

@helper.form(action = routes.Application.upload, 'enctype -> "multipart/form-data", 'multiple -> "") { 

<input type="file" name="fsa" multiple=""> 

<p> 
    <input type="submit"> 
</p> 

} 

控制器

def upload = Action(parse.multipartFormData) { request => 
      request.body.file("fsa").map { fsa => 
      import java.io.File 
       val filename = fsa.filename 
       val contentType = fsa.contentType 
       val timestamp: Long = System.currentTimeMillis/1000 
       fsa.ref.moveTo(new File("/tmp/"+timestamp+"/"+filename)) 
       Ok("File uploaded") 
      }.getOrElse { 
       Redirect(routes.Application.index).flashing(
        "error" -> "Missing file" 
       ) 
      } 
    } 

這事做reqest.body.file只得到一個文件,或者我應該通過一個數組或東西來遍歷?不太熟悉Scala,所以任何幫助表示讚賞。

回答

3

這花了我一段時間才能找出並有可能更優雅的解決方案,但看到你一直在等待6個月,我會告訴你我的醜陋的解決方案:

在前端,我送使用XHR文件到服務器,附加文件的形式單獨

var uploadFiles = document.getElementById("file-input").files; 

var formData = new FormData(); 
for (var i = 0; i < uploadFiles.length; i++) { 
    console.log("appending " + uploadFiles[i].name); 
    formData.append(uploadFiles[i].name, uploadFiles[i]); 
} 

var xhr = new XMLHttpRequest(); 
xhr.upload.addEventListener("load", function(e) { 
    console.log("upload successful"); 
}, false); 
xhr.upload.addEventListener("progress", function updateProgress(event) { 
    if (event.lengthComputable) { 
     var percentComplete = (event.loaded/event.total)*100; 
     console.log("Completed: " + percentComplete); 
    } 
}, false); 
xhr.open('POST', UPLOAD_URL, true); 

xhr.send(formData); 

服務器端代碼:

object Api extends Controller { 

    def upload = Action(parse.multipartFormData) { request => 
     println("Api.upload()") 
     LibraryService.uploadFiles(request.body.files) 
     Ok("Upload complete") 
    } 
} 


object LibraryService { 

    val libraryRoot: String = Play.configuration.getString("library.root").get; 

    def uploadFiles(files: Seq[FilePart[TemporaryFile]]) = { 
     files.foreach { filePart => 
      val newFile = new File(libraryRoot + filePart.filename) 
      if (newFile.exists) { 
       println("The file " + newFile.getAbsolutePath + " already exists. Upload cancelled.") 
      } else { 
       filePart.ref.moveTo(newFile) 
      } 
     } 
    } 
} 

將文件上傳爲列表證明是更具挑戰性的,我也只能得到該列表中第一個文件的引用。