2012-12-06 73 views
1

我試圖使用Play框架2(JAVA)播放2.0.4文件上傳不起作用?總是「MissingFilePart」

要做到這一點來實現文件的上傳,我已經遵循以下指導:http://www.playframework.org/documentation/2.0/JavaFileUpload

在服務器端,我總是在MultipartFormData中獲取MissingFilePart的對象。

這是我的看法:

@form(action = routes.ImmediateCollections.savePoliceReport, 'enctype -> "multipart/form-data") { 
    <fieldset> 
     <div class="fileupload fileupload-new"> 
      <span class="btn btn-file"> 
       <span class="fileupload-new">Select file</span> 
       <span class="fileupload-exists">Change</span> 
       <input type="file" name="policeReportFile" id="policeReportFile"/> 
      </span> 
      <span class="fileupload-preview"></span> 
      <a href="#" class="close fileupload-exists" style="float: none">×</a> 
     </div> 
    </fieldset> 
    @controls { 
     @submitbutton() 
    } 
} 

這將生成以下HTML:(。對於那些想知道的跨度和div的,我使用的是優秀jasny bootstrap擴展)

<form action="/immediatecollections/save-policereport" method="POST" enctype="multipart/form-data"> 
    <fieldset> 
     <div class="fileupload fileupload-new"> 
      <span class="btn btn-file"> 
       <span class="fileupload-new">Select file</span> 
       <span class="fileupload-exists">Change</span> 
       <input type="file" name="policeReportFile" id="policeReportFile"> 
      </span> 
      <span class="fileupload-preview"></span> 
      <a href="#" class="close fileupload-exists" style="float: none">×</a> 
     </div> 
    </fieldset> 
    <div class="control-group"> 
     <div class="controls"> 
      <input type="submit" class="btn btn-success" value="Save"> 
     </div> 
    </div> 
</form> 

請注意,我只有一個輸入字段。該表格僅用於一個目的:上傳1個文件。

這是我的控制器:

public static Result savePoliceReport() { 
    Http.MultipartFormData formData = request().body().asMultipartFormData(); 
    Http.MultipartFormData.FilePart policeReportFile = formData.getFile("policeReportFile"); 
    if (policeReportFile != null) { 
     // move file to somewhere 
     // save metadata to database 

     // for simplicity's sake: return json success = true or false 
     ObjectNode jsonResult = Json.newObject(); 
     jsonResult.put("success", true); 
     return ok(jsonResult); 
    } else { 
     ObjectNode jsonResult = Json.newObject(); 
     jsonResult.put("success", false); 
     return badRequest(jsonResult); 
    } 
} 

這種方法在路由文件中定義是這樣的:

POST /immediatecollections/save-policereport  controllers.ImmediateCollections.savePoliceReport 

現在,當我上載的服務器端文件和調試,這是我所得到的請求:

Server side debugging

如果我readi正確地說,它說文件內容丟失。發生了什麼?傳輸中的字節是否丟失?如果某件事失敗,爲什麼不玩拋出異常?

我已經在Chrome和Internet Explorer中試過這個,兩次都是相同的結果。

我在做什麼錯?謝謝!

回答

1

這是最終解決了在谷歌組,我會重新發布從那裏答案:

詹姆斯·羅珀:

MissingFilePart被拋出時,在多 數據的文件名字段爲空(名稱有點誤導)。爲什麼瀏覽器會發送一個空文件名爲 ,這是一個有趣的問題。在Chrome開發工具的網絡標籤 中,可以上傳一個小的(只有一個 幾個字節)的文件,然後看看請求體?請問 在這裏發送請求正文嗎?它應該看起來像這樣:

--AaB03x content-disposition:form-data; NAME = 「圖片」;文件名=「file1的。TXT」的Content-Type:text/plain的

這是上傳文件的內容 --AaB03x--

這裏的另一個問題是,雖然HTML規範鼓勵客戶 做出提交盡力而爲一個文件名參數,它不是強制性 場,所以玩不應該失敗的,如果它不存在

我的迴應:

你是c- orrect,文件名缺失。事實證明,Jasny的 JavaScript以某種方式打破了輸入元素。我簡單地用 取代了它,這是一個基本元素,由於缺少 時間而沒有花哨的標記,也許我會在稍後回顧。如果有人找出 解決方案,我會很高興聽到它,但現在我會保持原樣。

感謝您對James的回覆,如果發現錯誤,我會花費相當多的時間在 以上。 :-)

TLDR:name屬性在輸入標籤