2013-02-11 2 views
2

Мне нужно прочитать файл (который недоступен в сети) на сервере и вывести его пользователю в качестве загружаемого файла.Как читать файл сервера и выводить его как загружаемый файл в веб-браузере пользователей в XPages

Сценарий

  1. пользователь нажимает ссылку из XPage
  2. Запрос отправляется на сервер, который считывает предопределенный файл в файловой системе сервера
  3. Файл возвращается к пользователь как загружаемый файл в веб-браузере.

файл на сервере может быть в любом формате, например .pdf, .exe, .doc и т.д.

Это не имеет значения, если это делается на SSJS или Java.

Я действительно appreicate код

ответ

0

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

public static byte[] grabFile(String readFile) throws IOException { 

     File file = new File(readFile); 
     ByteArrayOutputStream ous = new ByteArrayOutputStream(); 
     InputStream ios = new FileInputStream(file); 

     try { 
      byte []buffer = new byte[4096]; 

      int read = 0; 
      while ((read = ios.read(buffer)) != -1) { 
       ous.write(buffer, 0, read); 
      } 
     } finally { 
      try { 
       if (ous != null) 
        ous.close(); 
      } catch (IOException e) { 
      } 

      try { 
       if (ios != null) 
         ios.close(); 
      } catch (IOException e) { 
      } 
     } 
     return ous.toByteArray(); 
    } 

public static void download() throws IOException { 
     byte[] data = grabFile("\\\\server\\path\\to\\file.pdf"); 
     HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
     response.reset(); 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-disposition", "attachment; filename=\"filename.pdf\""); 
     OutputStream output = response.getOutputStream(); 
     output.write(data); 
     output.close(); 
     FacesContext.getCurrentInstance().responseComplete(); 
    } 

Тогда просто вызовите метод загрузки из beforeRenderResponse вашей XPage

3

Вот аналогичный вопрос:

How to stream file from xPages?

А вот часть кода Java, взятой из там и завершенного мной (+ фикс от вас !). Я также проверил его и он работает:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
XspHttpServletResponse response = (XspHttpServletResponse) facesContext.getExternalContext().getResponse(); 

String strFileName = "myfile.txt"; 
String strFilePath= "c:" + File.separator + strFileName; 
response.setContentType(URLConnection.guessContentTypeFromName(strFileName)); 
response.setHeader("Content-Disposition","attachment;filename=" + strFileName); 

//File file = new File(strFilePath); 
FileInputStream fileIn = new FileInputStream(strFilePath); 
ServletOutputStream out = response.getOutputStream(); 

int iLen = 0; 
byte[] btBuffer = new byte[10240]; // Not sure about optimal buffer size 
while ((iLen = fileIn.read(btBuffer)) != -1) { 
    out.write(btBuffer, 0, iLen); 
} 

facesContext.responseComplete(); 
out.close(); 

Вы также можете сделать это в SSJS.

Если guessContentTypeFromName не угадает это, вам необходимо изменить файл определения на сервере. Или, если у вас ограниченный набор типов файлов, вы можете поместить таблицу типа MIME в свой код/​​приложение.

+0

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

+0

Я пытаюсь сделать это сегодня. Между тем, вероятно, неплохо проверить правильность пути и имени файла :-) –

+0

спасибо, вот что я получил http://notessidan.se/blogg.nsf/outputfile –