Struts2 を使用すると、Action
s とResult
s があります。
Action
したがって、リンクにマッピングされたが必要です。それを呼び出しましょうdownload_file.do
リンクのリストを作成し、どのファイルをダウンロードするかを struts2 に指示するパラメーターを渡します (任意のファイルを許可するのは危険なので、ファイル名が適しているかもしれません)。
<s:iterator value="fileList">
<s:a action="download_file">
<s:property value="fileName"/>
<s:text name="my.link"/>
</a>
</s:iterator>
今、あなたはいつもAction
のように設定する必要がありますfileName
。
メソッドでfileName を取得したらexecute
、 を開き、InputStream
を指定しFile
ますgetter
。ファイルのサイズとダウンロードする名前を取得することもできます。
のゲッターが 、サイズのゲッターInputStream
がであると仮定しましょう。getFileToDownload
getFileSize
コンテンツの処理に getter を提供する必要があります。これにより、ダウンロードしたファイルの名前が次のように設定されます。
public String getContentDisposition() {
return "attachment;filename=\"" + fileName + "\"";
}
また、MIME タイプのゲッター、次のようなもの
public String getContentType() {
return "text/plain";
}
明らかに、MIME を正しいタイプに設定します。
したがって、基本Action
は次のようになります
public class MyAction extends ActionSupport {
private final File baseDownloadDir = new File("somewhere");
private String fileName;
private InputStream inputStream;
private long fileSize;
@Override
public String execute() throws Exception {
/*
*This is a security hole begging to be exploited.
*A user can submit "../../../../someImportantFile"
*and potentially download arbitrary files from the server.
*You really need to do some validation on the input!
*/
final File fileToDownload = new File(baseDownloadDir, fileName);
fileSize = fileToDownload.length();
inputStream = new FileInputStream(fileToDownload);
return "downloadFile";
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getFileSize() {
return fileSize;
}
public InputStream getFileToDownload() {
return inputStream;
}
public String getContentDisposition() {
return "attachment;filename=\"" + fileName + "\"";
}
public String getContentType() {
return "text/plain";
}
}
次に、結果名を返します。それを呼び出しましょうdownloadFile
。
アクション マッピングでは、その結果を にマッピングする必要がStreamResult
あります。XML の例を次に示します。
<result name="downloadFile" type="stream">
<param name="inputName">fileToDownload</param>
<param name="contentType">${contentType}</param>
<param name="contentLength">${fileSize}</param>
<param name="contentDisposition">${contentDisposition}</param>
<param name="contentCharSet">UTF-8</param>
<param name="allowCaching">true</param>
</result>
文字セットを変更したい場合があります。