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

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

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

например,

первый запрос: /download/12345.jpg,
редирект на: /download/12345/picture.jpg
тогда браузер предложит сохранить объект как picture.jpg
...
Рейтинг: 0 / 0
Сервлет и имя файла
    #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
Сервлет и имя файла
    #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
Сервлет и имя файла
    #34074487
danii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению первы вариат так и не понял,
система может содержать тысячи файлов,
это что мне надо каждый раз копировать файл в контекст
и выдавать оттуда?
такой вариант неприемлем, к сожалению..
мб я не понимаю?

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

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

использование твоего варианта означает ли
что напр., файл picture.jpg должен храниться в d:\tomcat\webapps\Root\12345
...
Рейтинг: 0 / 0
Сервлет и имя файла
    #34075972
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
danii
использование твоего варианта означает ли
что напр., файл picture.jpg должен храниться в d:\tomcat\webapps\Root\12345 неть...
это означает, что ссылка для скачивания будет иметь такую uri
Код: plaintext
 servletDownload/picture.jpg
а в сервлете, ты этот файл буишь достовать откуда хошь
...
Рейтинг: 0 / 0
Сервлет и имя файла
    #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
Сервлет и имя файла
    #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
Сервлет и имя файла
    #34076134
danii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://localhost:8080/Download/qwerty
дает тот же результат
да ошибка 404
...
Рейтинг: 0 / 0
Сервлет и имя файла
    #34076146
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведи весь web.xml
проект лежит в /webapps/ROOT?
...
Рейтинг: 0 / 0
Сервлет и имя файла
    #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
Сервлет и имя файла
    #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
Сервлет и имя файла
    #34076355
danii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, теперь понятно что и как работает. спасибо!
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет и имя файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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