개요: 이 기사에서는 JavaBean이 각각 http 프로토콜과 ftp 프로토콜을 사용하여 다중 파일 업로드를 구현하는 두 가지 방법을 소개합니다. 먼저, http 프로토콜을 통해 여러 파일을 전송하는 기본 형식과 상세한 업로드 과정을 설명하고, ftp 클라이언트 클래스를 사용하여 ftp 업로드를 구현하는 방법을 간략하게 소개하고 마지막으로 두 가지 방법을 비교합니다.
키워드: JavaBean, http, ftp, ftpclient
JavaBean은 Java 기반 소프트웨어 구성 요소입니다. JSP는 웹 애플리케이션에 JavaBean 구성 요소를 통합하기 위한 완벽한 지원을 제공합니다. 이 지원은 개발 시간을 단축할 뿐만 아니라(반복적인 개발을 피하면서 테스트되고 신뢰할 수 있는 기존 구성 요소를 직접 사용할 수 있음) JSP 애플리케이션에 더 많은 확장성을 제공합니다.
파일 업로드 기능은 B/S 기반 개발 모델에서 매우 일반적입니다. 다른 개발 도구에 비해 JSP의 파일 업로드 지원은 완벽하지 않습니다. ASP처럼 구성 요소를 완료할 필요도 없고 PHP처럼 파일 업로드를 직접 지원하지도 않습니다. JSP에서 파일 업로드를 구현하는 방식은 다음과 같습니다. ServletRequest 클래스의 getInputStream() 메소드를 사용하여 클라이언트가 서버로 보낸 데이터 스트림을 얻은 다음 이 데이터 스트림을 처리하여 ServletRequest에 전달된 다양한 매개변수와 매개변수를 분석하고 가져옵니다. 파일 업로드 중에 서버에 데이터를 저장한 다음 파일 데이터를 파일로 저장하거나 데이터베이스에 삽입합니다. 일반적으로 JSP 페이지에서는 파일 업로드 기능을 처리하지 않지만 이러한 기능을 서블릿이나 JavaBeans에 넣어 구현합니다. Servlet을 사용하여 파일 업로드를 완료하는 예는 일부 JSP 관련 서적에 소개되어 있습니다. 여기에서는 JeanBean을 사용하여 파일 업로드를 완료하는 방법을 소개합니다. JSP에는 파일을 업로드하는 방법에는 HTTP 프로토콜과 FTP 프로토콜이라는 두 가지 방법이 있습니다. 둘 사이에는 전송 원칙에 큰 차이가 있습니다. 다음은 소스 코드를 기반으로 한 구현에 대해 간략하게 소개할 것입니다. 독자들은 이를 통해 뭔가를 얻을 수 있을 것입니다. 다음 프로그램이 디버깅되어 전달되었습니다. 디버깅 환경: window 2000 server+Apache +tomcat4.0, JavaBean 디버깅 환경: JDK1.4+Editplus.
JSP에서 JavaBean을 사용하여 웹 기반 파일 업로드 기능을 구현하려면 일반적으로 세 가지 유형의 파일 조합이 필요합니다. 이 세 파일은 각각 인터페이스를 제공하는 HTML 페이지 파일, JavaBean의 업로드 기능을 구현하기 위한 호출을 완료하는 JSP 파일, JavaBean을 구현하는 Java 클래스 파일입니다. 아래에서는 HTTP 프로토콜과 FTP 프로토콜을 사용하여 파일 업로드 기능을 구현하는 JavaBean 부분에 중점을 둘 것입니다.
1 여러 파일을 업로드하려면 HTTP 프로토콜을 사용하십시오.
과거 HTML에서는 양식에서 파일을 업로드할 수 없었기 때문에 일부 웹 페이지의 기능이 다소 제한되었습니다. RFC1867 사양(즉, Html의 양식 기반 파일 업로드)은 양식을 확장하고 양식 요소 <input type=file>을 추가합니다. 이 요소를 사용하면 브라우저는 자동으로 입력 상자와 버튼을 생성합니다. 입력 상자를 사용하면 사용자가 로컬 파일 이름과 경로 이름을 입력할 수 있고, 버튼을 사용하면 브라우저에서 사용자가 선택할 수 있는 파일 선택 상자를 열 수 있습니다. 파일을 선택하세요. 구체적인 양식 구현은 다음과 같습니다:
<FORMMETHOD="POST" ACTION="*.jsp" ENCTYPE="multipart/form-data">
<입력 유형="파일" 이름="파일1" 크기="50"><BR>
<INPUT TYPE="제출" VALUE="업로드">
</FORM>
파일 붙여넣기를 선택한 경우 로컬 파일의 절대 경로를 직접 입력하세요. 양식의 작업 속성 값은 *.jsp입니다. 이는 요청(업로드된 파일 포함)이 *..jsp 파일. 이 과정에서 실제로 HTTP를 통한 파일 업로드가 구현됩니다. 클라이언트에서 서버로의 파일 업로드는 HTTP 프로토콜의 CGI(Common Gateway Interface)를 통해 지원됩니다. 이 업로드 방법을 사용하려면 브라우저와 WEBServer가 모두 Rfc1867을 지원해야 합니다. JavaBean은 ServletRequest 클래스의 getInputStream() 메소드를 통해 클라이언트가 서버로 보내는 데이터 스트림을 얻어 업로드된 파일 형식을 분석하고, 분석 결과를 바탕으로 여러 파일을 서버 측의 대상 파일에 순차적으로 출력합니다. 이 예제에서 JavaBeande의 기능은 특히 testUpload 클래스에 의해 구현됩니다. TestUpload 클래스의 프레임워크는 다음과 같습니다:
public class testUpload
{
공개 테스트업로드(){……}
공개 최종 무효 초기화(ServletConfig 구성)에서 ServletException이 발생합니다.
{ m_application = config.getServletContext() }
public void upload()는 testUploadException, IOException, ServletException을 발생시킵니다.
{…………}
개인 무효 getDataSection(){………}
개인 무효 getDataHeader(){………}
공개 int 저장(문자열 destPathName)
SmartUploadException, IOException, ServletException 발생
{…………}
…
}
초기화() 메소드를 통해 서블릿의 실행 환경을 초기화합니다. upload() 메서드를 사용하여 입력 스트림을 얻고, 업로드된 파일의 형식을 분석하고, 업로드된 각 파일의 속성을 여러 File 클래스 인스턴스에 할당하여 처리합니다. 이러한 File 클래스 인스턴스는 Files 클래스에서 관리됩니다. File 클래스는 각 파일의 속성에 따라 save() 메소드를 호출하여 여러 파일을 서버 측의 대상 파일에 순차적으로 출력합니다. upload() 메소드는 http1.1 프로토콜에 의해 전송되는 파일 형식을 분석하는 데 사용되는 핵심입니다. 테스트 후에는 upload() 메서드를 이해하는 데 유용한 전송 스트림 파일 형식을 얻을 수 있습니다. 예를 들어 My Documentstt.txt 파일을 업로드합니다. 형식은 다음과 같습니다.
//파일 구분 기호
-------------7d226137250336
//파일 정보 헤더
콘텐츠 처리: 양식 데이터; 이름="FILE1"; 파일 이름="C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documentstt.sql"
콘텐츠 유형: 텍스트/일반
//소스 파일 내용
테이블 정보 생성(
콘텐츠 이미지 null);
//다음 파일 구분자
-------------7d226137250336
내용-처리: 양식-데이터 이름="FILE2";
콘텐츠 유형: 애플리케이션/옥텟 스트림
--------------------------------7d226137250336
위 파일에서 여러 파일을 업로드할 때 HTTP 프로토콜이 All 입력 스트림에 입력되고 특정 구분 기호로 구별됩니다. 실제로 upload() 메소드는 위의 파일을 분석하여 구분 기호의 내용, 각 파일의 내용 형식, 파일의 전체 경로 이름, 파일의 실제 데이터의 시작과 끝을 결정하는 것입니다. 여기서 주목해야 할 점은 구분 기호가 무작위라는 것입니다. 이는 전송 스트림 파일의 첫 번째 캐리지 리턴 문자 앞의 모든 문자입니다.
Upload() 메소드의 구현 프로세스는 다음과 같습니다. 먼저 입력 스트림 파일을 바이트 배열 m_binArray로 출력합니다. 이는 다음 코드를 통해 구현됩니다.
m_totalBytes=1024; 총읽기=0;
for(; totalRead < m_totalBytes; totalRead += readBytes)
노력하다
{ m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
}catch(Exception e){ throw new SmartUploadException("업로드할 수 없습니다.");}
여기서는 루프의 멀티바이트 읽기 방법이 사용됩니다. 위 루프는 배열이 채워질 때까지 계속해서 데이터를 읽습니다. 파일을 완전히 검색할 수 있으면 파일의 모든 바이트도 검색할 수 있습니다. 그러나 네트워크 속도는 일반적으로 CPU보다 훨씬 느리기 때문에 프로그램이 모든 데이터가 도착하기 전에 네트워크 버퍼를 쉽게 지울 수 있습니다. 실제로 멀티바이트 읽기 메서드는 일시적으로 비어 있지만 열려 있는 네트워크 버퍼에서 데이터를 읽으려고 할 때 0을 반환합니다. 이는 데이터가 존재하지 않지만 네트워크 스트림이 닫히지 않았음을 의미합니다. 이 경우 단일 바이트 메서드는 실행 중인 프로그램의 실행을 방해하므로 다중 바이트 메서드의 동작이 단일 바이트 read() 메서드의 동작보다 더 좋습니다. 다음으로 바이트 배열 m_binArray가 분석됩니다. 먼저 구분 기호를 찾습니다. getDataHeader() 메서드를 사용하여 소스 파일의 전체 경로 이름, 소스 파일 확장자 및 소스 파일 콘텐츠 형식이 결정되는 파일 정보 헤더 값을 반환합니다. 파일 내용 데이터를 반환하고 기록하는 메서드 바이트 배열에서 파일 데이터의 시작 위치와 끝 위치입니다. 그런 다음 File 클래스 인스턴스를 생성하고 파일의 전체 경로 이름, 소스 파일의 확장자, 소스 파일 콘텐츠 형식, 파일 콘텐츠 데이터의 시작 및 끝 위치를 File 클래스 인스턴스의 속성에 넣습니다. 다음 구분자를 찾고 분석이 완료될 때까지 위 과정을 계속 반복합니다.
2 FTP 프로토콜을 사용하여 여러 파일을 업로드합니다.
FTP 프로토콜은 인터넷에서 파일을 전송하는 데 사용되는 프로토콜입니다. Java에서 이 기능을 구현하는 것은 FtpClient 클래스의 도움으로 수행됩니다. 특정 구현 프로세스: 먼저 FTP 서버와의 연결을 설정합니다. 파일 입력 스트림 FileInputStream을 포함하여 파일 전송 방법을 초기화합니다. 바이트 배열로 읽습니다. 데이터는 출력 스트림 TelnetOutputStream에 기록됩니다(네트워크 링크에 데이터를 쓰려면 write 메소드를 사용하십시오). 이런 방식으로 소스 파일과 동일한 이름의 파일이 서버에 복사됩니다. 이 예에서 JavaBean은 connectServer(), upload() 및 closeConnect()의 세 가지 메소드를 통해 파일 업로드 프로세스를 완료합니다. 주요 구현은 다음과 같습니다:
public class ftpUpload
{ 문자열 파일명; 문자열 파일명1;FtpClient ftpClient;
public void connectServer(문자열 서버, 문자열 사용자, 문자열 비밀번호, 문자열 경로)
{
//서버: FTP 서버의 IP 주소 사용자: FTP 서버에 로그인하기 위한 사용자 이름
//password: FTP 서버에 로그인하기 위한 사용자 이름의 비밀번호 path: FTP 서버의 경로
시도{ ftpClient=new FtpClient();
ftpClient.openServer(서버);
ftpClient.login(사용자, 비밀번호);
System.out.println("로그인 성공!");
if (path.length()!=0) ftpClient.cd(경로);
ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}
}
공개 무효 closeConnect()
{시도{ftpClient.closeServer();
}catch (IOException ex) {System.out.println(ex);}
}
공개 무효 업로드()
{ 파일 이름1=find파일 이름(파일 이름);
//filename에서 파일 이름을 분석하여 대상 파일 이름으로 사용합니다.
노력하다 {
TelnetOutputStream os=ftpClient.put(filename1);
java.io.File file_in=new java.io.File(파일명);
FileInputStream is=new FileInputStream(file_in);
바이트[] 바이트=새 바이트[1024];
정수 c;
while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c) }
is.close();
} catch (IOException ex) {System.out.println(ex);}
}
}
connectServer()는 FTP 서버와 연결을 설정하는 기능을 완료하고 FtpClient의 openServer(string server) 메소드를 사용하여 원격 FTP 서버를 연 다음 FtpClient의 login(user,password) 메소드를 사용하여 서버에 로그인합니다. 원격 FTP 서버에 로그인하는 방법에는 등록된 사용자로 로그인하는 방법과 익명으로 로그인하는 방법이 있습니다. 전자는 사용자가 먼저 서버의 클라이언트로 등록하도록 요구합니다. 서버는 사용자에게 로그인 계정과 비밀번호를 제공하고 해당 계정과 비밀번호를 기반으로 서버에 연결합니다. 후자는 사용자가 원격 호스트의 공개 파일에 대한 액세스를 제한하기 위해 등록하지 않고 "annoymous" 및 "guest"라는 특수 사용자 이름을 사용해야 합니다. 보안상의 이유로 대부분의 익명 FTP 호스트는 일반적으로 원격 사용자에게 파일 다운로드만 허용하고 업로드는 허용하지 않습니다. 이는 FTP 서버 설정에 따라 달라집니다. 사용자는 실제 상황에 따라 두 가지 방법을 선택할 수 있습니다. 로그인 후 FtpClient의 bin() 메소드를 이용하여 전송 모드를 바이트 모드로 초기화합니다. upload()는 파일 업로드 기능을 완료합니다. 소스 파일의 파일 입력 스트림 FileInputStream을 생성하고 입력 스트림을 바이트 배열에 쓴 다음 TelnetOutputStream의 쓰기 메서드를 사용하여 바이트 배열의 데이터를 네트워크 링크에 씁니다. TelnetOutputStream은 FTP 서버에 파일을 오픈하므로 대상 파일에 데이터가 기록되면서 파일 업로드가 완료됩니다. closeConnect()를 사용하려면 서버와의 연결을 끊어야 합니다.
위는 단일 파일을 업로드하는 과정일 뿐입니다. 파일이 여러 개인 경우 이 업로드 과정을 여러 번 호출할 수 있습니다. 위의 두 가지 방법을 통해 FTP 프로토콜을 사용하여 여러 파일을 업로드하는 것이 상대적으로 간단하고 구현하기 쉽다는 것을 알 수 있습니다. FTP 프로토콜을 사용하여 파일을 업로드하는 것은 일반적으로 클라이언트 측 프로그램이며 서버 측 보안 설정은 더 복잡하지만 HTTP 프로토콜을 사용하여 파일을 업로드하는 것은 서버 측 응용 프로그램이며 보안 설정은 비교적 간단합니다. . 그리고 테스트를 통해 대용량 파일 전송 시에는 FTP 업로드 방식이 HTTP 업로드 방식보다 수십 배, 심지어 수백 배 빠르지만, 1M 이하의 파일 전송 시에는 HTTP 업로드 방식에 비해 약간 느린 것으로 나타났습니다. 따라서 두 가지 전송 방법 모두 각각의 장점이 있으므로 독자는 각자의 상황에 따라 행동하는 것이 좋습니다. 궁금하신 점이 있으시거나 다른 부분의 소스코드가 필요하시면 연락주세요!