0

通常の HTML タグでは、次のようなアンカー タグを使用してダウンロード リンクを生成できます。

<a href="www.example.com/somefile.zip">DOWNLOAD</a>

struts2 では、ファイル名とファイル URL をデータベースに保存しました。次に、JSP ファイルに、次のようなダウンロード リンクを設定します。

<s:iterator value="fileList">
<a href='<s:property value="fileURL"/>'> <s:property value="fileName"/> </a>
</s:iterator>

このようにして、ファイル名とそのリンクが入力されます。リンクにマウスを合わせると、ブラウザのステータス バーに正しいファイル URL が表示されます。しかし、リンクをクリックすると、ダウンロード ダイアログ ボックスが表示されるようになりました。インターネットを検索したところ、FileInputStream を使用するように指示されました。私の質問は、FileInputStream を使用する代わりに、上記のコードとしてダウンロード リンクを生成することは可能ですか?

4

1 に答える 1

3

Struts2 を使用すると、Actions とResults があります。

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がであると仮定しましょう。getFileToDownloadgetFileSize

コンテンツの処理に 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>

文字セットを変更したい場合があります。

于 2013-04-12T15:25:05.750 に答える