2016-05-14 60 views
0

我通過HTML格式的文件上傳:如何從沒有servlet的JAVA html表單獲取信息?

<form class="formulario" action="validatorKenken.cgi" method="GET"> 
        <input type="file" name="xml" accept="*.xml"> <br/> 
        <input type="submit"> 
</form> 

的Java文件被調用它是由一種叫做CGI文件。 我需要在服務器上保存我正在上傳的文件。

我已經看到了使用servlet的解決方案,但是由於導入javax.servlet不存在,所以我編譯它時出現問題。

我正在使用Java 1.7.0_101

謝謝!

回答

0

該腳本的CONTENT_TYPE環境變量設置爲either application/x-www-form-urlencoded or multipart/form-data。後者通常僅用於使用<input type=file>控件的表單。無論哪種方式,請求主體都將處於標準輸入中,Java將繼承所有環境變量。

由於您的表單有一個文件字段,內容類型將爲multipart/form-data。正文將包含多部分MIME消息。

解析多部分MIME消息是一個數量級的更容易,如果您使用的是JavaMail實現,因爲你可以利用它MimeMultipart類,及其相關類:

Path saveDir = Paths.get("/home/enery93/Downloads"); 

// id or name attribute of HTML <input type='file'> element 
String fileInputControlName = "file"; 

Path formDataFile = Files.createTempFile(null, null); 
Files.copy(System.in, formDataFile, StandardCopyOption.REPLACE_EXISTING); 

MimeMultipart formData = new MimeMultipart(
    new FileDataSource(formDataFile.toFile())); 

int count = formData.getCount(); 
for (int i = 0; i < count; i++) { 
    BodyPart part = formData.getBodyPart(i); 

    // See HTML 4.01 spec, section 17.13.4 at 
    // https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 
    ContentDisposition disposition = 
     new ContentDisposition(part.getDisposition()); 
    String name = disposition.getParameter("name"); 

    if (fileInputControlName.equals(name)) { 
     Path saveFile = saveDir.resolve(part.getFileName()); 
     try (InputStream content = part.getInputStream()) { 
      Files.copy(content, saveFile); 
     } 
     break; 
    } 
} 

Files.delete(formDataFile); 

在撰寫本文時,一完整的javax.mail.jar位於http://java.net/projects/javamail/downloads/download/javax.mail.jar

如果你不能或不願意使用JavaMail,你將不得不自己解析多部分內容,這是不愉快的。

+0

我無法使用JavaMail。那麼,我必須做什麼? – Enery93

+0

爲了能夠管理文件,用這一行就夠了? 「String fileInputControlName =」file「;」但是,如果類型是字符串,並且我正在處理二進制文件,它怎麼可能? – Enery93

+0

正如我在上面的註釋中指出的那樣,這只是HTML中出現的'id'或'name'屬性的值。該文件的內容是無關緊要的。 – VGR