Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет и имя файла / 16 сообщений из 16, страница 1 из 1
20.10.2006, 15:41:16
    #34070340
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
есть сервлет Download
по параметру id он находит имя(filename) и путь к файлу, открывает и передает его содержимое в response.getOutputStream(),
на клиенте при выборе "Сохранить" по умолчанию используется имя "Download.ru", как сделать чтобы использовалось filename
...
Рейтинг: 0 / 0
20.10.2006, 15:59:04
    #34070418
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
способ, который будет работать всегда, независимо от браузера:

мапишь сервлет на /download/*.jpg

в сервлете вырезаешь из request.getRequestURL() ид с помощью регекспа например, получаешь имя. далее редиректишь на /download/id/filename.jpg, опять получаешь id (теперь уже другой регексп соответственно), и выдаешь поток байт.
...
Рейтинг: 0 / 0
23.10.2006, 15:25:08
    #34074326
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
к сожалению не понимаю.
какую инф. я должен получить из request.getRequestURL() ?
id я могу получить так request.getParameter("id")
получить путь и имя файла отрыть его и выдать поток быйт проблем нет.
файл может быть любого типа(расширения) doc, xls, rtf, txt, zip ...
...
Рейтинг: 0 / 0
23.10.2006, 15:32:54
    #34074351
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
этот способ подразумевает, что id передается как часть адреса, а не параметром.

например,

первый запрос: /download/12345.jpg,
редирект на: /download/12345/picture.jpg
тогда браузер предложит сохранить объект как picture.jpg
...
Рейтинг: 0 / 0
23.10.2006, 15:40:14
    #34074379
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
daniiна клиенте при выборе "Сохранить" по умолчанию используется имя "Download.ru", как сделать чтобы использовалось filename
Я делаю что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
String fileName = ...;
String userAgent = request.getHeader("USER-AGENT").toLowerCase();
fileName = URLEncoder.encode(fileName, "UTF8");
 if  (userAgent !=  null 
  && userAgent.indexOf("opera") == - 1 
  && userAgent.indexOf("msie") != - 1 ) {
  response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
}  else  {
  response.setHeader("Content-Disposition", "attachment; filename*=\"utf-8'" + fileName + "\"");
}
...
Рейтинг: 0 / 0
23.10.2006, 15:56:31
    #34074453
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
Denis Popov
Я делаю что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
String fileName = ...;
String userAgent = request.getHeader("USER-AGENT").toLowerCase();
fileName = URLEncoder.encode(fileName, "UTF8");
 if  (userAgent !=  null 
  && userAgent.indexOf("opera") == - 1 
  && userAgent.indexOf("msie") != - 1 ) {
  response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
}  else  {
  response.setHeader("Content-Disposition", "attachment; filename*=\"utf-8'" + fileName + "\"");
}


вот вот. именно такой код я и предложил избежать. он конечно тоже рабочеспособный, но имхо менее универсальный, чем мой.
...
Рейтинг: 0 / 0
23.10.2006, 16:03:34
    #34074487
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
к сожалению первы вариат так и не понял,
система может содержать тысячи файлов,
это что мне надо каждый раз копировать файл в контекст
и выдавать оттуда?
такой вариант неприемлем, к сожалению..
мб я не понимаю?

второй вариант как раз то что искал,
работает корректно
...
Рейтинг: 0 / 0
24.10.2006, 09:52:12
    #34075902
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
to Deady,
хочу понять твой вариант, объясни пожалуйста.

описываю все по пунктам
есть компьтер
установлен tomcat в d:\tomcat
web приложение размещено в d:\tomcat\webapps\Root
файлы (которые загружает web клиент) лежат в c:\files

использование твоего варианта означает ли
что напр., файл picture.jpg должен храниться в d:\tomcat\webapps\Root\12345
...
Рейтинг: 0 / 0
24.10.2006, 10:10:05
    #34075972
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
danii
использование твоего варианта означает ли
что напр., файл picture.jpg должен храниться в d:\tomcat\webapps\Root\12345 неть...
это означает, что ссылка для скачивания будет иметь такую uri
Код: plaintext
 servletDownload/picture.jpg
а в сервлете, ты этот файл буишь достовать откуда хошь
...
Рейтинг: 0 / 0
24.10.2006, 10:27:21
    #34076039
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
ок
те физически его там нет.

в web.xml
я делаю
<servlet-mapping>
<servlet-name>ru.mydomain.mypackage.MyClass</servlet-name>
<url-pattern>/Download/*</url-pattern>
</servlet-mapping>

а в сервлете пишу
String filename="file1.tgz";
response.sendRedirect("/Download/"+filename);

томкат выдает ошибку
The requested resource (/Download/file1.tgz) is not available
в чем тогда ошибка?
...
Рейтинг: 0 / 0
24.10.2006, 10:43:12
    #34076099
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
а если зайти на http://localhost:8080/Download/qwerty

сервлет вообще вызывается? нет ли еще каких-нибудь сервлетов, замапенных на tgz?

фишка в том, чтобы при любом обращении к любому адресу, начинающемуся с http://localhost:8080/Download/ вызывался сервлет.

The requested resource (/Download/file1.tgz) is not available - это 404 чтоли?
...
Рейтинг: 0 / 0
24.10.2006, 10:50:49
    #34076134
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
http://localhost:8080/Download/qwerty
дает тот же результат
да ошибка 404
...
Рейтинг: 0 / 0
24.10.2006, 10:53:26
    #34076146
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
приведи весь web.xml
проект лежит в /webapps/ROOT?
...
Рейтинг: 0 / 0
24.10.2006, 11:06:57
    #34076200
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<!DOCTYPE web-app 
     PUBLIC  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <display-name>GAF  1 </display-name>
    <description>
	GAF  1 
    </description>
    <mime-mapping>
	<extension>ppt</extension> 
      <mime-type>application/vnd.ms-powerpoint</mime-type> 
    </mime-mapping>
    <mime-mapping>
      <extension>xls</extension>
      <mime-type>application/vnd.ms-excel</mime-type>
    </mime-mapping>
    <servlet>
      <servlet-name>Get</servlet-name>
      <servlet- class >ru.tut.nikulin.gaf1.Get</servlet- class >
    </servlet>
    <servlet-mapping>
      <servlet-name>Get</servlet-name>
      <url-pattern>/DnLwD</url-pattern>
    </servlet-mapping>
    <servlet>
      <servlet-name>Admin</servlet-name>
      <servlet- class >ru.tut.nikulin.gaf1.Admin</servlet- class >
    </servlet>
    <servlet-mapping>
      <servlet-name>Admin</servlet-name>
      <url-pattern>/admin</url-pattern>
    </servlet-mapping>

</web-app>

проект лежит в /gaf1

это сервлет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
 package  ru.tut.nikulin.gaf1;

 import  java.io.File;
 import  java.io.FileInputStream;
 import  java.io.IOException;
 import  java.io.OutputStream;
 import  java.net.URLEncoder;
 import  java.text.SimpleDateFormat;
 import  java.sql.SQLException;
 import  java.util.Date;
 import  javax.servlet.ServletContext;
 import  javax.servlet.http.HttpServlet;
 import  javax.servlet.http.HttpServletRequest;
 import  javax.servlet.http.HttpServletResponse;

 public   class  Get  extends  HttpServlet{

   public   void  doGet(HttpServletRequest req, HttpServletResponse resp)  throws  IOException {
    try {
     int  size= 0 , n= 0 ;
     float  sec = ( float ) 0 . 0 ;
    Settings settings= null ;
     try {
      settings =  new  Settings(req);
    } catch (Exception e){  throw   new  IOException( e.getMessage() ); }

     long  tm = System.currentTimeMillis();
    ServletContext sc = getServletContext(); 
    String folder = (String) req.getParameter("folder");
    String name   = (String) req.getParameter("name");
    String id     = (String) req.getParameter("id");
    String email  = (String) req.getParameter("email");
     if  ( folder== null  || name== null  || id== null  || email== null ) { 
	 throw   new  IOException("Please fill out all request parameters");     
    } 
    Date date =  new  Date();

    String filename = settings.getFolder()+"\\"+folder+"\\"+name;
    String mimeType = sc.getMimeType(filename); 
    mimeType = mimeType==null ? "text/plain" : mimeType;

 /*  
   String userAgent = req.getHeader("USER-AGENT").toLowerCase(); 
   String urlfn = URLEncoder.encode(filename, "UTF8"); 
   if (userAgent != null && userAgent.indexOf("opera") == -1 && userAgent.indexOf("msie") != -1) { 
      resp.setHeader("Content-Disposition", "attachment; filename=\"" + urlfn + "\"");
    }  else  { 
      resp.setHeader("Content-Disposition", "attachment; filename*=\"utf-8'" + urlfn + "\""); 
    } 
*/
    resp.sendRedirect("/DnLwD/"+name);
    resp.setContentType(mimeType); 
    FileInputStream fis =  null ;
    OutputStream os =  null ;
     try {
    
      File file =  new  File(filename); 
      size = ( int )file.length();
      n= 1 ;
      resp.setContentLength( size );
      fis =  new  FileInputStream( file ); 

      os = resp.getOutputStream(); 
       byte [] buf =  new   byte [ 1024 ]; 
       int  count =  0 ;
       while  ((count = fis.read(buf)) >=  0 ) { 
        os.write(buf,  0 , count); 
      } 
      String ddate = ( new  SimpleDateFormat("yyyy-MM-dd")).format( date ) ;
      String dtime = ( new  SimpleDateFormat("hh:mm:ss")).format( date ) ;
      tm = System.currentTimeMillis() - tm; 
      DocDnld docd =  new  DocDnld(email,Integer.parseInt(id),ddate,dtime,size,( float )(tm /  1000 . 0 ),n);
       try {
        docd.insert( req );
        setDocStatus( req, Integer.parseInt(id), email);
      } catch (Exception e){
          throw   new  IOException( e.getMessage() );
      }
    } finally {
      fis.close();
      os.close();
    }
     new  Log(req, "ok");
   } catch (Exception maine){
      new  Log(req, maine.getMessage());
   }
  }

   public   void  doPost(HttpServletRequest req, HttpServletResponse resp) throws  IOException{
    doGet(req, resp);
  } 

   private   void  setDocStatus(HttpServletRequest req,  int  id, String email) throws  Exception{
    ToDownload todwd =  new  ToDownload(id,email);
    todwd.setStatus(  new  Spr( 4 ,"") );
    todwd.update( req );
  }
...
Рейтинг: 0 / 0
24.10.2006, 11:29:25
    #34076312
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
1. обращаться к сервлету соответственно надо http://localhost:8080/gaf1/DnLwD/id
2. логика сервлета неправильная. нужно 2 обращения.

пример. пусть есть файл /var/common/image.gif, доступен он должен быть по ID=1.

первое, когда идет первоначальный запрос файла с указанным ID:
http://localhost:8080/gaf1/DnLwD/getfile?id=1

Сервлет в этом случае видит, что параметром передан идентификатор, он сразу же должен сделать редирект на /gaf1/DnLwD/1/image.gif (заметь, в урле указан контекст, в котором лежит проект - gaf1, каталог, на который замапен сервлет, идентификатор файла, имя файла):
Код: plaintext
1.
2.
3.
4.
5.
6.
if (request.getParameter("id")!=null) {
   int id = Integer.parseInt(request.getParameter("id"));
   String filename = new IdToFilenameConverter().convert(id);
   response.sendRedirect("/gaf1/DnLwD/"+id+"/"+filename)
}

второе, когда браузер приходит с редиректа. в этом случае идентификатора в параметрах нет. соответственно, нужно отдать сам файл.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
else {
   Pattern pattern = Pattern.compile("/\w+/\w+/(\d+)/\.*"); //регексп, по нему мы вытянем ID
   Matcher matcher = pattern.matcher(request.getRequestURI());
   int id = - 1 ;
   if (matcher.find()) id = matcher.group( 1 );
   String filename = new IdToFilenameConverter().convert(id); 
   File f = new File(filename);
   String contentType = this.getServletContext().getMimeType(file.getCanonicalPath());

   response.setContentType(contentType);
   //далее идет вывод файла
}

...
Рейтинг: 0 / 0
24.10.2006, 11:40:21
    #34076355
danii
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервлет и имя файла
да, теперь понятно что и как работает. спасибо!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет и имя файла / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]