2010-03-08 1 views
6
.

Несмотря на то, что он не является частью веб-приложений HTTP 1.1/RFC2616, которые хотят заставить ресурс быть скачано (а не отображаться) в браузере можно использовать Content-Disposition заголовок так:Java webapp: добавление заголовка содержимого для принудительного браузера. «Сохранение как» поведение.

Content-Disposition: attachment; filename=FILENAME 

Даже жесткая это только определенный в RFC2183 и не часть HTTP 1.1 работает в большинстве веб-браузеров, как хотелось.

Так что с клиентской стороны все достаточно хорошо.

Однако на стороне сервера, в моем случае, у меня есть веб-приложение Java, и я не знаю, как я должен установить этот заголовок, особенно в следующих случаях ...

У меня будет файл (например, «bigfile»), размещенный на экземпляре Amazon S3 (мой ведро S3 должно быть доступно с использованием частичного адреса: files.mycompany.com/), чтобы пользователи могли получить доступ этот файл на files.mycompany.com/bigfile.

Теперь есть способ, чтобы обработать сервлет (или .jsp), так что заголовок Content-Disposition всегда добавляется, когда пользователь хочет скачать этот файл?

Какой код выглядел бы и какие бывают, если они есть?

+0

поэтому, если файл будет загружен с s3, а http-запрос будет отправлен на сервер s3, то s3 должен добавить этот заголовок, а не ваше приложение, не так ли? –

+0

@splix: посмотрел ваш комментарий, я думаю, так ... Но выяснение того, что это как раз то, что касается всего моего вопроса :) Если вы сделаете ответ, уточнив это чуть-чуть больше, я подниму и соглашусь :) – SyntaxT3rr0r

+0

@ splix: видел ваш комментарий, я искал Google на S3 и обнаружил, что, по-видимому, благодаря популярному запросу вы можете * «Загружать с помощью пользовательских заголовков» * (файлы в свое ведро), что было бы отличным способом решить мою проблему! – SyntaxT3rr0r

ответ

2

У вас не было бы URL-адреса, который был бы прямой ссылкой на файл. Вместо этого у вас будет URL-адрес, который приведет к вашему сервлет-коду (или к некоторому коду действия в вашей серверной структуре). Это, в свою очередь, должно было бы получить доступ к содержимому файла и выкопать его клиенту после настройки заголовка. (Вы также должны помнить, что нужно иметь дело с заголовками управления кэшем, если это необходимо.)

Класс HttpServletResponse имеет API, который позволит вам установить все нужные заголовки. Вы должны убедиться, что вы настроили заголовки до, вы начинаете выгружать содержимое файла, потому что заголовки буквально должны быть первыми в потоке, отправляемом в браузер.

Это не так сильно отличается от ситуации, когда у вас может быть сервлет, который будет сгенерировать скачать на лету.

редактировать Я оставлю этот материал выше здесь ради потомства, но отмечу, что есть (или может быть) каким-то образом передать некоторые HTTP заголовки в S3, когда вы магазин файл, так что Amazon выплюнет их, когда файл будет подан. Я не совсем уверен, как вы это сделаете, и я не уверен, что «Content-disposition» - это заголовок, который вы можете настроить таким образом, но я буду продолжать искать.

+0

@Pointy: so Полагаю, это не совместимо с случаем S3, который я объяснил в своем вопросе? Я имею в виду, если мне нужно передать файл через мой сервер, это будет победить всю точку S3, не так ли ?? – SyntaxT3rr0r

+0

Да, я согласен, но вижу свой комментарий. Я признаюсь в том, что я легкий, когда дело доходит до деталей S3, но я ищу ... – Pointy

0

Поместите .htaccess файл в корневой папке с помощью следующей строки:

Header set Content-Disposition attachment 
4

я получил эту работу, как Понтии указали. Вместо того, чтобы напрямую связываться с активом - в моем случае pdfs - теперь он ссылается на JSP, называемый download.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(); 

%> 
0

Я только что нашел это через google.

И у меня была аналогичная проблема, но я все еще хочу использовать сервлет (поскольку я создаю Контент).


Однако следующая строка - это все, что вам нужно в сервлете.

response.setHeader("Content-Disposition", "attachment; filename=downloadedData.json"); 
Смежные вопросы