7

HTTP 1.1/RFC2616 webapps の一部ではありませんが、ブラウザーでリソースを (表示するのではなく)強制的にダウンロードContent-Dispositionしたい場合は、次のようなヘッダーを使用できます。

Content-Disposition: attachment; filename=FILENAME

難しいことに、RFC2183 でのみ定義されており、HTTP 1.1 の一部ではありません。ほとんどの Web ブラウザーで必要に応じて機能します。

したがって、クライアント側からは、すべてが十分です。

ただし、サーバー側では、私の場合、Java webapp があり、特に次の場合に、そのヘッダーを設定する方法がわかりません...

Amazon S3 インスタンスでホストされているファイル (「bigfile」など) を用意します (私の S3 バケットは、files.mycompany.com/のような部分的なアドレスを使用してアクセスできます)。これにより、ユーザーは files.mycompany.com/ でこのファイルにアクセスできるようになります。 .mycompany.com/bigfile .

ユーザーがそのファイルをダウンロードしたいときに常にヘッダーが追加されるように、サーブレット(または.jsp )を作成する方法はありますか?Content-Disposition

コードはどのようなものになり、落とし穴がある場合はどうなりますか?

4

4 に答える 4

4

Pointyが指摘したように、私はこれを機能させました。アセット (私の場合は pdf) に直接リンクする代わりに、download.jsp という JSP にリンクします。これは、GET パラメータを取得して解析し、pdf をダウンロードとして提供します。

ここからダウンロード

これが私が使用したjspコードです。IE8、Chrome、および Firefox で動作します。

<%@page session="false"
            contentType="text/html; charset=utf-8"
            import="java.io.IOException,
                    java.io.InputStream,
        java.io.OutputStream,
        javax.servlet.ServletContext,
        javax.servlet.http.HttpServlet,
        javax.servlet.http.HttpServletRequest,
        javax.servlet.http.HttpServletResponse,
        java.io.File,
        java.io.FileInputStream"
 %>
<%  
//Set the headers.
response.setContentType("application/x-download"); 
response.setHeader("Content-Disposition", "attachment; filename=downloaded.pdf");

[pull the file path from the request parameters]   

File file = new File("[pdf path pulled from the requests parameters]");
FileInputStream fileIn = new FileInputStream(file);
ServletOutputStream outstream = response.getOutputStream();

byte[] outputByte = new byte[40096];

while(fileIn.read(outputByte, 0, 40096) != -1)
{
    outstream.write(outputByte, 0, 40096);
}
fileIn.close();
outstream.flush();
outstream.close();

%>
于 2011-10-26T01:01:25.297 に答える
2

ファイルへの直接参照である URL はありません。代わりに、サーブレット コード (またはサーバー側フレームワークのある種のアクション コード) につながる URL を用意します。次に、ヘッダーを設定した後、ファイルの内容にアクセスし、それらをクライアントにシャベルで送信する必要があります。(必要に応じて、キャッシュ制御ヘッダーを処理することも忘れないでください。)

HttpServletResponse クラスには、必要なすべてのヘッダーを設定できる API があります。ファイルの内容のダンプを開始する前に、ヘッダーを設定していることを確認する必要があります。ヘッダーは、ブラウザーに送信されるストリームで文字通り最初に来る必要があるためです。

これは、オンザフライでダウンロードを生成するサーブレットがある状況とそれほど違いはありません。

編集後世のためにここにその内容を残しますが、ファイルを保存するときにいくつかの HTTP ヘッダーを S3 に渡す方法がある (またはある可能性がある) ことに注意してください。Amazon はそれらを吐き出します。ファイルが提供されるとき。どのようにしてそれを行うのか正確にはわかりません.「Content-disposition」がそのように設定できるヘッダーであるかどうかもわかりませんが、引き続き調べます.

于 2010-03-08T23:28:08.507 に答える
0

.htaccess次の行を含むルート フォルダーにファイルを配置します。

Header set Content-Disposition attachment
于 2010-03-08T23:59:49.320 に答える