そのため、Primefaces 3.0を使用してzipファイルをアップロードします。その後、Beanコードでファイルを解凍します。Primefacesファイルのアップロードコードは次のとおりです。
<h:form id="step3" enctype="multipart/form-data" >
<p:panel id="p3" header="STEP 2: Upload Data File(s)" visible="#{uploadData.panel2}">
<h:outputText value="Select data files to upload." />
<br />
<br />
<p:fileUpload fileUploadListener="#{uploadData.handleFileUpload}"
id="fu2"
mode="advanced"
update="messages3, b2"
multiple="true"
disabled="#{uploadData.fileupload}" />
<p:growl id="messages3" showDetail="true" />
<br />
<div class="finish_button">
<p:commandLink id="b2" value="." actionListener="#{uploadData.storedetails('add')}" update="messages3, b2, fu2, @form step2:fu1" disabled="#{uploadData.button2}" />
</div>
</p:panel>
</h:form>
ファイルのアップロードは正常に機能します。そのために標準のprimefacesショーケースコードを使用し、次に私のコードがこれを行います(このコードはすべてビュースコープのBeanにあります)。
ret = d.unzip(fname, dir+"/");
button2 = false;
'd'はスコープ外のクラスです。解凍機能は、すべてのファイルが宛先ディレクトリで解凍されるときにも機能しますが、button2がfalseに設定されていても、unzipを実行した後、インターフェイスでクリックできないという問題が発生します。解凍は以下のとおりです。
public int unzip(String filename, String zipPath) {
try {
ZipFile zipFile = new ZipFile(filename);
Enumeration e = zipFile.entries();
while(e.hasMoreElements()) {
ZipEntry entry = (ZipEntry)e.nextElement();
File destinationFilePath = new File(zipPath,entry.getName());
//create directories if required
destinationFilePath.getParentFile().mkdirs();
//if the entry is directory, leave it. Otherwise extract it
if(entry.isDirectory()) {
continue;
}
else {
System.out.println("Extracting " + destinationFilePath);
//Get the InputStream for current entry of the zip file
BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
int b;
byte buffer[] = new byte[1024];
//read the current entry from the zip file, extract it
//and write the extracted file
FileOutputStream fos = new FileOutputStream(destinationFilePath);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
while ((b = bis.read(buffer, 0, 1024)) != -1) {
bos.write(buffer, 0, b);
}
//flush and close streams
bos.flush();
bos.close();
bis.close();
fos.close();
}
}
zipFile.close();
return 1;
}
catch(IOException e) {
showmessage("Uh oh", "There was a problem unzipping the files: "+e.getMessage());
return -1;
}
}
小さなファイル(3Mb)のアップロードと解凍は正常に機能します。ファイルが解凍されたら、フォームのb2をクリックできます。ただし、大きなファイルの場合、b2をdisabled ='true'に設定し、アップロードして解凍しようとしても、コードを解凍した後でも、ファイル全体b2はフォームでクリックできません。したがって、解凍プロセスに関する何かは、より良い言葉がないために、フォームを「ハング」させるか、応答させないようですが、理由はわかりません。フォームの外には、レスポンシブな他のボタンがあります。アップロードウィジェットと同じフォーム内のボタンだけです。