2014-11-03 4 views
6

Я хочу, чтобы моя программа имела всплывающее окно сохранить как параметр окна перед загрузкой файла, однако при запуске моего сервлета он автоматически начинает загрузку файла. Что мне здесь не хватает?Проблема при загрузке файла с использованием содержимого-распоряжения

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    ServletOutputStream outputStream = response.getOutputStream(); 
    FileInputStream fis=new FileInputStream("E:/sound.mp3"); 
    response.setContentLength(fis.available()); 
    response.setContentType("audio/basic"); 
    response.addHeader("content-disposition", "attachment;filename=abc.mp3"); 
    while(true){ 
     int read = fis.read(); 
     if(read==-1)break; 
     outputStream.write(read); 
    } 
    fis.close();   
} 
+0

Я считаю, что это на стороне сервера. Вы пытаетесь распространить событие сервера на стороне клиента. – christopher

+0

Взгляните на: http://stackoverflow.com/questions/3802510/force-to-open-save-as-popup-open-at-text-link-click-for-pdf-in-html и http: //stackoverflow.com/questions/2226192/generate-some-xml-in-javascript-prompt-user-to-save-it С уважением –

+1

@ DaniloMuñoz: AS fas, так как я вижу, что два сценария разные, мои ... но спасибо за беспокойство –

ответ

6

Ваша программа не является настольной/автономной, так как это сервлет, запущенный на сервере. Когда вы запустите его в Eclipse, щелкнув правой кнопкой мыши и run as ->run on server, Eclipse фактически открывает веб-страницу для отображения результатов. Поэтому ваша программа теперь является веб-приложением, а Eclipse (или открываемая страница) является клиентом . Клиент сохраняет информацию, которую вы отправили, а не свою программу. Понял?

Заголовок content-disposition есть только, чтобы предложить имя файла для загрузки. Настройки браузера определяют, откроет ли он Сохранить как Окно или нет. Вы не можете это контролировать.

Например, в Google Chrome, в Setting/Advanced Setting/Downloads, есть вариант Ask where to save each file before downloading. Только если этот параметр выбран, он откроет нужное диалоговое окно. В противном случае он сохранит его в местоположении по умолчанию (также определенное в настройках браузера). Аналогичные варианты существуют для всех браузеров.

Пожалуйста, обратите внимание, что в зависимости от заголовка content-type, браузер попытается дисплей содержание, а не скачать его. Например, браузер попытается отобразить тексты и html. Но тогда вы можете силой загрузки, установив заголовок в не отображаемым типа:

response.setContentType("application/octet-stream");

В случае, если вы не хотите, чтобы создать веб-приложение: Так как программа работает на сервере , он просто отправляет информацию и выполняется. Это программа , которая решает, что с ней делать. В данном случае клиент является браузером (или Eclipse открывает страницу браузера). Заголовки, такие как заголовок content-disposition, предназначены для браузеров. Если вы хотите создать своего клиента (клиент Swing, приложение для Android, приложение для iPhone), который НЕ является браузером, тогда клиент получит информацию с сервера и решит, что с ним делать (отобразить его или сохранить в любом путь), даже игнорируя заголовки HTTP.

+0

Большое спасибо. Вы объяснили это хорошо. –

-1

Необходимо выполнить диалог вручную, например. (http://docs.oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html). После того, как пользователь выберет файл, вы сможете запустить загрузку HTTP-запроса (на ваш сервлет) и сохранить файл на нужный путь.

2

Попробуйте посмотреть здесь: http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofFiledialogboxes.htm

вынимает основное утверждение в коде и положить run(new FileChooserTest(), 250, 110); в своем собственном коде. Если бы я это делал, я бы сделал int с именем saveStatus и 3 финалами, которые равны 0, 1 и 2 с именем waiting, save и cancel. Затем я бы сделал цикл while в вашем другом программировании, чтобы узнать, было ли saveStatus равно waiting, чтобы приостановить вашу программу (но не диалог). Впоследствии я бы сделал оператор if, чтобы узнать, было ли saveStatus равным save. Если да, загрузите его, а если нет, не делайте этого. Просто как тот.

2

Ваша проблема в Mime-Type. Некоторые типы (особенно те, которые известны конкретному обработчику) будут загружаться напрямую большинством браузеров. Это немного помогает использовать приложение/двоичный файл, но даже тогда некоторые браузеры могут быть настроены для его загрузки или интерпретации расширения имени файла в обработчике.

Я думаю, что большинство решений используют javascript на странице перед ссылкой для скачивания.