Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой. / 7 сообщений из 7, страница 1 из 1
20.07.2012, 09:34:10
    #37886393
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
При загрузке xml файла с русским текстом на сервер сбивается кодировка. На томкате все работало, при переносе на Вебсферу появились проблемы. ОС сервера - Red Hat, буду рад если подскажите как это исправить :)
сервлет
Код: java
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.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
private static final int CR = (int)'\r';
private static final int LF = (int)'\n';

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException
  {String fileName=null;

//Поток, в который будет писаться содержимое 
    int[] dataSlice = extractData(request);
  
   response.setContentType("text/html;charset=Cp1251");
   try { FileOutputStream fos = new FileOutputStream("/tmp/file.txt");
    int i;
    for(i=0; i<dataSlice.length; i++)     
       fos.write(dataSlice[i]);
     fos.flush();
    fos.close();
    fileName=newFile("/tmp/file.txt",response);
    download(fileName, response);
    }
   catch (IOException e)
   {
	   System.out.println(e.getMessage());
   }
  }

  private String newFile(String fileName,HttpServletResponse response) throws IOException
  { 
	  String stroka=null;
	  String nFileName=null;
	  resp.setContentType("text/html;charset=Cp1251");
	
	  try{
			
		
		  
		
			FileInputStream fis = fis=new FileInputStream(fileName);
			BufferedInputStream bis = new BufferedInputStream(fis);
			  DataInputStream BRf = new DataInputStream(bis);
			
	    
		    stroka=BRf.readLine();//читается пустая строка
		 
		    stroka=BRf.readLine();//мусор
		 
		    stroka=BRf.readLine();// инфа о файле в том числе имя файла
		    
		    String str[]=stroka.split(" ");
	     
		    int num=10;  		    
		    
		    nFileName=str[str.length-1].substring(num,str[str.length-1].length()-1);// получаем имя файла
		 	 
		    BufferedWriter out = new BufferedWriter(
		            new FileWriter("/tmp/"+nFileName));
		   
		    
		    stroka=BRf.readLine();
		    do{
		        
		    	stroka=BRf.readLine();
		    	if (stroka!=null)
		    	out.write(stroka);
		    	
		        		    }while(stroka!=null);
		    out.close();
		    fis.close();
                          bis.close();
		    BRf.close();
	  }
		    
	  catch (IOException e) 
	  {
		  System.out.println(e.getMessage());
		
	  }
	 
	 
	  return ("/tmp/"+nFileName);
	  
  }
  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
      response.setContentType("text/html;charset=Cp1251");
     
}
  
  private int[] extractData(HttpServletRequest request) throws IOException
    {
// Содержимое пришедших байтов их запроса (содержимое приходящего файла)
    InputStream is = request.getInputStream();
    int[] data = new int[request.getContentLength()];
    int bytes;
    int counter = 0;
    while((bytes=is.read())!=-1)
      {
      data[counter]=bytes;
      counter++;
      }
    is.close();

// Определение индексов срезки
    int i;
    int beginSliceIndex = 0;
// Конечный индекс срезки - длина границы + доп. символы.
    int endSliceIndex = data.length - getBoundary(request).length()-9;

    for(i = 0; i < data.length; i++)
      {
// Начальный индекс срезки: после того как встретятся 2 раза подряд \r\n
      if(data[i] == CR && data[i+1] == LF && data[i+2] == CR && data[i+3] == LF)
        {
        beginSliceIndex = i+4;
        break;
      }
    }

  int[] dataSlice = new int[endSliceIndex-beginSliceIndex+1];
  for(i = beginSliceIndex; i<=endSliceIndex; i++)
    {
    dataSlice[i-beginSliceIndex]=data[i];
    }

  return dataSlice;
  }

// Поиск границы
private String getBoundary(HttpServletRequest request)
  {
  String cType = request.getContentType();
  return cType.substring(cType.indexOf("boundary=")+9);
  }

private void download(String filename, HttpServletResponse response){
    try {
          File file = new File(filename);

          response.setContentType("text/html;charset=Cp1251;application/octet-stream");
          response.setHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");

          ServletOutputStream sos = response.getOutputStream();
          DataInputStream dis = new DataInputStream(new FileInputStream(file));

          beginTransfer(dis, sos);

    } catch (Exception ex) {
          System.out.println(ex.getMessage());
    }
}

private void beginTransfer(DataInputStream dis,ServletOutputStream sos) throws IOException{
    byte[] buffer = new byte[1];
    while (dis.read(buffer) != -1) 
    {
            
    	sos.write(buffer);
    }
    dis.close();
    sos.close();
}



форма:
Код: html
1.
2.
3.
4.
 <form action="UploadServlet" method="post" enctype="multipart/form-data">
                <input name="data" type="file"><br>
                <input type="submit"><br>
  </form>
...
Рейтинг: 0 / 0
20.07.2012, 10:30:03
    #37886474
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
KTOIA,

Попробуйте charset сменить с Cp1251 на UTF-8.
...
Рейтинг: 0 / 0
20.07.2012, 10:32:54
    #37886483
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
ак у xml кодировка Cp1251
...
Рейтинг: 0 / 0
20.07.2012, 11:08:41
    #37886554
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
попробовал,не помогло
...
Рейтинг: 0 / 0
20.07.2012, 11:12:51
    #37886564
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
DataInputStream здесь для чего вообще???
...
Рейтинг: 0 / 0
20.07.2012, 11:26:21
    #37886609
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
KTOIA,

Вот тут еще почитайте.
...
Рейтинг: 0 / 0
25.07.2012, 11:43:38
    #37891806
KTOIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой.
исправил в функции newFile:

1)открытие сохраненного файла с информацией от dataSlice:

Код: java
1.
2.
3.
  FileInputStream fis = new FileInputStream(new File(fileName));
		  BufferedReader BRf = new BufferedReader(new InputStreamReader(fis,
		  "Cp1251"));



2)создание файла:
Код: java
1.
BufferedReader BRf = new BufferedReader(new InputStreamReader(fis,"Cp1251"));



теперь все работает
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Загрузка и выгрузка текстовых файлов через сервлеты. Проблема с кодировкой. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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