Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Передача файла по сети


Автор: Nesmishlenish 21.8.2006, 18:29
  Здравствуйте, тут проблемка есть одна) Имется клиент - серверное приложение, на сервере генерится файл (отчет если быть точнее), и соответственно сохранить его можно только на сервере)! Вот, а нужно добиться что бы этот файл каким-то образом находился на стороне клиента) Как это можно сделать? 

Автор: powerOn 21.8.2006, 18:54
Что за сервер?

Автор: Nesmishlenish 21.8.2006, 19:35
 Oracle App Server

Автор: LSD 21.8.2006, 21:12
А что есть на клиенте?

Автор: Nesmishlenish 23.8.2006, 09:25
Все что понадобиться то и поставим) тут идея важна)

Автор: LSD 23.8.2006, 10:41
Напишите приложение которое бы скачивало файл с сервера, можно даже чтобы сервер уведомлял его о том что доступны новые данные. А можно просто сгенерировать пользователю веб страничку где дать ссылку на файл.

Вариантов много, задача не до конца ясна.

Автор: Nesmishlenish 24.8.2006, 09:59
Цитата(LSD @ 23.8.2006,  10:41)
А можно просто сгенерировать пользователю веб страничку где дать ссылку на файл.

 Я собственно и попытался сделать что то подобное. Генерю ссылку, но тут возникает трабл: я генерирую два отчета- в RTF и PDF, ссылки отличаются только расширением файла, когда пользователь нажимает кнопочку и при этом генерится RTF то в браузере выскакивает окошко мол Сохранить файл или Открыть его, в этом случае работает все как надо, а вот когда нажимается кнопочка и генериться PDF то выскакивает ошибка :
Код
java.lang.NullPointerException
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
    at oracle.adfinternal.view.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:157)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:64)
    at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl._invokeDoFilter(AdfFacesFilterImpl.java:367)    
    at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl._doFilterImpl(AdfFacesFilterImpl.java:336)    
    at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl.doFilter(AdfFacesFilterImpl.java:196)    
    at oracle.adf.view.faces.webapp.AdfFacesFilter.doFilter(AdfFacesFilter.java:87)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:629)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:870)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:451)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:218)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:119)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)    
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.0.0) ].util.ResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
    at java.lang.Thread.run(Thread.java:595)

А генерирую ссылку вот таким вот кодом:
Код
HttpServletRequest hsr = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
URL url;
URL ur;
try
{
  url = new URL(hsr.getRequestURL().toString());
  ur = new URL(url,"testReport" + str);
  ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
  HttpServletResponse response = (HttpServletResponse)ectx.getResponse();
  response.sendRedirect(ur.getFile());
}
catch(MalformedURLException e)
{
  // TODO
}
catch(IOException e)
{
  // TODO
}

Автор: Nesmishlenish 31.8.2006, 10:30
Все, проблема решена) 
Вот кусочек кода который отвечает за передачу файла на клиента)
Код
FileInputStream bis = null;
ServletOutputStream bos = null;

FacesContext context = FacesContext.getCurrentInstance(); 
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
// Устанавливаем тип содержимого       
response.setContentType("application/"+str); 
response.setHeader("Content-disposition","filename=file."+str);

try {
  File fileName = new File("rep\\testReport."+str);
  bis = new FileInputStream(fileName.getAbsolutePath());
  bos = response.getOutputStream();
  byte[] buff = new byte[2048];
  int bytesRead;
  while (-1 !=(bytesRead = bis.read(buff,0,buff.length)))
  {
     bos.write(buff,0,bytesRead);
  }
  response.getOutputStream().flush(); 
  response.getOutputStream().close(); 
  context.responseComplete(); 
} catch (IOException e) {
  e.printStackTrace(); 
}

Автор: Nehxby 11.9.2006, 09:57
Здравствуйте. Есть уточняющий вопрос.
Код, приведенный здесь в качестве примера, я использовал и он работает.
НО: хотелось бы передавть файлы в запакованном формате, но чтобы конечный пользователь этого "не чувствовал"   smile  (передаются файлы *.doc - хотелось бы чтобы они сразу и открывались у пользователя в браузере)

Я решил использовать для этого передачу файлов запакованных GZIP:

Код

получение имени файла
...
            response.setHeader("Content-Type","application/octet-stream;");
            response.setHeader("Content-Encoding", "gzip");
            response.setHeader("Content-Disposition", "filename=\""+fName+"\"");

            BufferedInputStream in=new BufferedInputStream (new FileInputStream (getServletContext().getRealPath("/")+"\\docs\\keyw.rar"));

            GZIPOutputStream out1 = new GZIPOutputStream(response.getOutputStream());
            BufferedOutputStream binout=new BufferedOutputStream(out1);
...
передача файла


Но, если задавать дополнительный хидер ("Content-Encoding", "gzip"), тогда браузер не понимает хидер ("Content-Disposition", "filename=\""+fName+"\"") (тестировал на ie).

Вместо того чтобы предлагать пользователю открыть или сохранить передаваемый ворд, он предлагает только сохранить файл с названием моей jsp - getDocFile.jsp.

Помогите мне решить эту задачу - хочу и паковать, и чтобы браузер понимал что передается файл MSWord

Автор: kkorsakoff 11.9.2006, 17:42
Надо выставить Content-Type. Не application/octet-stream, а вордовский. На память не помню, но что-то вроде application/vnd.ms-word.
Браузер именно по этому заголовку определяет тип файла.

И Content-Dis­position должен быть

"Content-Dis­position : attachment; filename=fName"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)