기술지원 문의

레진 사용시 자료실구현후 다운을 받을때 파일이 깨지는 문제에...
조광복 / 2003-10-01 00:00

ps 전 JSP를 공부하고 있는 학생입니다. 톰켓보다 레진이 좋은것 같아 사용하는중입니다. 제 질문이 여기 어울리는지는 모르겠지만 제 나름되로 절박한 심정으로 물어봅니다. 전에도 질문을 올렸는데 못보신것 같아 다시올려봅니다.

개인적으론 소스자체가 톰켓에 맞게 되어 있어 레진하구 뭔가 안맞는 문제같다고 생각하는 중입니다. 

암튼 자료실 파일 다운문제를 해결해 주시면 고맙겠습니다. 


--------------- 

사용하는 레진은 
Resin 2.1.10 (built Wed Jun 18 09:16:53 PDT 2003) 
에서 사용하구 있습니다. 

저는 자료실구현후 다운을 받을때 파일이 깨지는 문제에 
대해서 알구 싶습니다. 

일단은 다른 서버없이 레진을 서블릿,서버겸해서 사용하구 있습니다. 

참고로 다음 소스들은 원래 톰켓을 기반으로 만들어진 소스입니다. 

그래서 그런지 톰겟으로 돌리면 정상적인 파일다운이 잘 됩니다. 

그것들을 제가 다시 레진으로 돌리는 중인데 문제가 발생하는거죠. 

암튼 

일단 저장을 하는 jsp를 실행하면 
C:\\\\0000\\\\up\\\\ 
에 정상적인 파일들(실행도 되구 잘 읽힙니다) 
이 들어갑니다. 그상태에서 download.jsp 라는 것을 만들어서 

<%@ page contentType=\"application;\" 
%><%@ page language=\"java\" import=\"java.util.*,java.io.*,java.sql.*,java.text.*\" 
%> 
<%! 
public String toKor(String str){ 
try{ 
return new String(str.getBytes(\"8859_1\"),\"KSC5601\"); 
}catch(Exception e){ 
return str; 

}%> 
<% 
String filename = toKor(request.getParameter(\"file\")); 
File file = new File(\"C:\\\\0000\\\\up\\\\\"+filename); 
System.out.println((int)file.length()+\" \"+filename); 
//byte b[] = new byte[(int)file.length()]; 
//byte b[] = new byte[1024*5]; 
byte b[] = new byte[4096]; 
response.setHeader(\"Content-Disposition\", \"attachment;filename=\" + java.net.URLDecoder.decode(request.getParameter(\"file\")) + \";\"); 
if (file.isFile()) 

BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file)); 
BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream()); 
int read = 0; 
while ((read = fin.read(b)) != -1) 

outs.write(b,0,read); 

outs.close(); 
fin.close(); 

%> 

실행을 시키면 다운은 잘 됩니다.(원래 
contentType=\"text/html;charset=euc-kr\"%> 라는 부분도 있었는데 다운시 한글명이 깨지길래 빼버렸습니다. 이유는 모르겠습니다..) 

문제는 다운이 된후 파일들이 열면 내용이 깨져있고 (워드나 파워포인트등은 다 깨져서 열리지 않거나 열려도 내용물이 깨집니다) 

실행파일들은 실행이 안되는 상태가 되어 버립니다. 

강사님은 레진서버자체의 문제라고 하시면서 

아파치를 깔아보라구 권하셨지만 

전 아파치를 안깔구 해결할 방법은 없나 해서 물어봅니다. 

ps

참고로

save 하는 파일은 다음과 같습니다.

<%@ page import=\"java.sql.*, java.util.*,java.io.*\" contentType=\"text/html;charset=euc-kr\"%>
<%@ page import=\"board.Database\"%>
<%@ page import=\"com.oreilly.servlet.MultipartRequest\"%>
<%@ page import=\"com.oreilly.servlet.multipart.DefaultFileRenamePolicy\"%>

<%!
public void jspInit(){
try{
Class.forName(\"oracle.jdbc.driver.OracleDriver\");
}catch(ClassNotFoundException e){
System.out.println(\"Driver Load Error\");
}
}
public String toKor(String str){
try{
return new String(str.getBytes(\"8859_1\"),\"KSC5601\");
}catch(Exception e){
return str;
}
}
%>
<%
int flag=0;

 String savePath=\"C:\\\\0000\";
 int sizeLimit = 5 * 1024 * 1024 ; // 5메가까지 제한 넘어서면 예외발생
 
 MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit,\"KSC5601\",new DefaultFileRenamePolicy());
String fileName=multi.getFilesystemName(\"upfile\"); // 파일의 이름 얻기
int filesize=0;
if(fileName != null)
{
File file = new File(savePath+\"\\\\\"+fileName);
filesize = (int)file.length();
}
String imsi_num=multi.getParameter(\"num\");//새글이면 0, 답변글이면 원본글의 num값
String imsi_page=multi.getParameter(\"page\");
String writer=multi.getParameter(\"writer\");
String email=multi.getParameter(\"email\");
String title=multi.getParameter(\"title\");
String content=multi.getParameter(\"content\").replace(\\,\\\");

String password=multi.getParameter(\"passwd\");

String sql=\"select MAX(b_num) as lastNum from board\";
ResultSet rs=myDB.select(sql);
rs.next();
int num=0;
num=rs.getInt(\"lastNum\");
num++;
int hit=0;int step=0;int ref=0;int level=0;
if(imsi_num.equals(\"0\"))
{/*
새글일 경우
1.b_ref는 b_num값을 넣는다.
2.b_step,b_level=0한다.
  */
ref=num;
step=0;
level=0;
}else{
sql=\"select * from board where b_num=\"+imsi_num;
rs=myDB.select(sql);
rs.next();
int origin_ref=0;
int origin_step=0;
int origin_level=0;

origin_level=rs.getInt(\"b_level\");//원글의 b_ref의 값
origin_step=rs.getInt(\"b_step\");//원글의 b_step의 값
origin_ref=rs.getInt(\"b_ref\");//원글의 b_ref의 값
/*
답변글일 경우
1.b_ref는 원글의 b_ref값을 넣는다.
2.b_step은 원글의 b_step+1을 한다.
3.b_levle은 원글의 b_level+1을 한다.
*/
ref=origin_ref;
step=origin_step+1;
level=origin_level+1;
/* b_step은 원글의 b_step+1를 하되 원글 보다 큰b_step은 모두 1씩 증가한다. */
sql=\"update board set b_step=b_step+1 where b_ref=\"+origin_ref+\" and b_step>\"+origin_step;
myDB.update(sql);
}

sql=\"insert into board values(board_increment.NEXTVAL\";
sql+=\",\"+writer;
sql+=\",\"+email;
sql+=\",\"+title;
sql+=\",\"+content;
sql+=\",\"+password;
sql+=\",sysdate\";
sql+=\",\"+hit;
sql+=\",\"+level;
sql+=\",\"+step;
sql+=\",\"+ref+\",\"+fileName+\",\"+filesize+\")\";
flag=myDB.update(sql);
myDB.closeAll();

if(flag==1){
response.sendRedirect(\"board2_list.jsp\");
return;
}else{
%>



<%
}
%>

Re:레진 사용시 자료실구현후 다운을 받을때 파일이 깨지는 문제에...
관리자 / 2003-10-01 00:00

안녕하세요
제가 테스트 해보았는데 잘 안되어서
response 쪽에 몇가지 추가했더니 잘되네요.

추가한 것은 
-----------
response.reset();
response.setContentLength((int)file.length());
-----------
입니다.
안전성을 위해서 
response.flushBuffer();
을 추가하는 것도 좋을 것 같구요.

참고로 제가 테스한 파일을 첨부하오니 테스트해보세요.

--조광복 님의 글 [2003-10-01 13:46:04]
>ps 전 JSP를 공부하고 있는 학생입니다. 톰켓보다 레진이 좋은것 같아 사용하는중입니다. 제 질문이 여기 어울리는지는 모르겠지만 제 나름되로 절박한 심정으로 물어봅니다. 전에도 질문을 올렸는데 못보신것 같아 다시올려봅니다.

개인적으론 소스자체가 톰켓에 맞게 되어 있어 레진하구 뭔가 안맞는 문제같다고 생각하는 중입니다. 

암튼 자료실 파일 다운문제를 해결해 주시면 고맙겠습니다. 


--------------- 

사용하는 레진은 
Resin 2.1.10 (built Wed Jun 18 09:16:53 PDT 2003) 
에서 사용하구 있습니다. 

저는 자료실구현후 다운을 받을때 파일이 깨지는 문제에 
대해서 알구 싶습니다. 

일단은 다른 서버없이 레진을 서블릿,서버겸해서 사용하구 있습니다. 

참고로 다음 소스들은 원래 톰켓을 기반으로 만들어진 소스입니다. 

그래서 그런지 톰겟으로 돌리면 정상적인 파일다운이 잘 됩니다. 

그것들을 제가 다시 레진으로 돌리는 중인데 문제가 발생하는거죠. 

암튼 

일단 저장을 하는 jsp를 실행하면 
C:\\\\0000\\\\up\\\\ 
에 정상적인 파일들(실행도 되구 잘 읽힙니다) 
이 들어갑니다. 그상태에서 download.jsp 라는 것을 만들어서 

<%@ page contentType=\"application;\" 
%><%@ page language=\"java\" import=\"java.util.*,java.io.*,java.sql.*,java.text.*\" 
%> 
<%! 
public String toKor(String str){ 
try{ 
return new String(str.getBytes(\"8859_1\"),\"KSC5601\"); 
}catch(Exception e){ 
return str; 

}%> 
<% 
String filename = toKor(request.getParameter(\"file\")); 
File file = new File(\"C:\\\\0000\\\\up\\\\\"+filename); 
System.out.println((int)file.length()+\" \"+filename); 
//byte b[] = new byte[(int)file.length()]; 
//byte b[] = new byte[1024*5]; 
byte b[] = new byte[4096]; 
response.setHeader(\"Content-Disposition\", \"attachment;filename=\" + java.net.URLDecoder.decode(request.getParameter(\"file\")) + \";\"); 
if (file.isFile()) 

BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file)); 
BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream()); 
int read = 0; 
while ((read = fin.read(b)) != -1) 

outs.write(b,0,read); 

outs.close(); 
fin.close(); 

%> 

실행을 시키면 다운은 잘 됩니다.(원래 
contentType=\"text/html;charset=euc-kr\"%> 라는 부분도 있었는데 다운시 한글명이 깨지길래 빼버렸습니다. 이유는 모르겠습니다..) 

문제는 다운이 된후 파일들이 열면 내용이 깨져있고 (워드나 파워포인트등은 다 깨져서 열리지 않거나 열려도 내용물이 깨집니다) 

실행파일들은 실행이 안되는 상태가 되어 버립니다. 

강사님은 레진서버자체의 문제라고 하시면서 

아파치를 깔아보라구 권하셨지만 

전 아파치를 안깔구 해결할 방법은 없나 해서 물어봅니다. 

ps

참고로

save 하는 파일은 다음과 같습니다.

<%@ page import=\"java.sql.*, java.util.*,java.io.*\" contentType=\"text/html;charset=euc-kr\"%>
<%@ page import=\"board.Database\"%>
<%@ page import=\"com.oreilly.servlet.MultipartRequest\"%>
<%@ page import=\"com.oreilly.servlet.multipart.DefaultFileRenamePolicy\"%>

<%!
public void jspInit(){
try{
Class.forName(\"oracle.jdbc.driver.OracleDriver\");
}catch(ClassNotFoundException e){
System.out.println(\"Driver Load Error\");
}
}
public String toKor(String str){
try{
return new String(str.getBytes(\"8859_1\"),\"KSC5601\");
}catch(Exception e){
return str;
}
}
%>
<%
int flag=0;

 String savePath=\"C:\\\\0000\";
 int sizeLimit = 5 * 1024 * 1024 ; // 5메가까지 제한 넘어서면 예외발생
 
 MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit,\"KSC5601\",new DefaultFileRenamePolicy());
String fileName=multi.getFilesystemName(\"upfile\"); // 파일의 이름 얻기
int filesize=0;
if(fileName != null)
{
File file = new File(savePath+\"\\\\\"+fileName);
filesize = (int)file.length();
}
String imsi_num=multi.getParameter(\"num\");//새글이면 0, 답변글이면 원본글의 num값
String imsi_page=multi.getParameter(\"page\");
String writer=multi.getParameter(\"writer\");
String email=multi.getParameter(\"email\");
String title=multi.getParameter(\"title\");
String content=multi.getParameter(\"content\").replace(\\,\\\");

String password=multi.getParameter(\"passwd\");

String sql=\"select MAX(b_num) as lastNum from board\";
ResultSet rs=myDB.select(sql);
rs.next();
int num=0;
num=rs.getInt(\"lastNum\");
num++;
int hit=0;int step=0;int ref=0;int level=0;
if(imsi_num.equals(\"0\"))
{/*
새글일 경우
1.b_ref는 b_num값을 넣는다.
2.b_step,b_level=0한다.
  */
ref=num;
step=0;
level=0;
}else{
sql=\"select * from board where b_num=\"+imsi_num;
rs=myDB.select(sql);
rs.next();
int origin_ref=0;
int origin_step=0;
int origin_level=0;

origin_level=rs.getInt(\"b_level\");//원글의 b_ref의 값
origin_step=rs.getInt(\"b_step\");//원글의 b_step의 값
origin_ref=rs.getInt(\"b_ref\");//원글의 b_ref의 값
/*
답변글일 경우
1.b_ref는 원글의 b_ref값을 넣는다.
2.b_step은 원글의 b_step+1을 한다.
3.b_levle은 원글의 b_level+1을 한다.
*/
ref=origin_ref;
step=origin_step+1;
level=origin_level+1;
/* b_step은 원글의 b_step+1를 하되 원글 보다 큰b_step은 모두 1씩 증가한다. */
sql=\"update board set b_step=b_step+1 where b_ref=\"+origin_ref+\" and b_step>\"+origin_step;
myDB.update(sql);
}

sql=\"insert into board values(board_increment.NEXTVAL\";
sql+=\",\"+writer;
sql+=\",\"+email;
sql+=\",\"+title;
sql+=\",\"+content;
sql+=\",\"+password;
sql+=\",sysdate\";
sql+=\",\"+hit;
sql+=\",\"+level;
sql+=\",\"+step;
sql+=\",\"+ref+\",\"+fileName+\",\"+filesize+\")\";
flag=myDB.update(sql);
myDB.closeAll();

if(flag==1){
response.sendRedirect(\"board2_list.jsp\");
return;
}else{
%>



<%
}
%>