종속성이 없는 간단한 Java 파일 업로더

게시 됨: 2023-01-06

최신 웹 응용 프로그램 및 웹 사이트의 기본 요구 사항 중 하나는 문서, 사진 및 비디오와 같은 파일을 업로드하는 기능입니다. 예를 들어 사용자는 Instagram과 같은 소셜 네트워킹 플랫폼에 비디오와 이미지를 게시할 수 있습니다.

이전에는 파일 업로드 절차를 구현하고 관리하는 것이 어려운 작업이었습니다. 고맙게도 온라인 기술의 발전으로 인해 파일 업로드가 더 간단해졌습니다. 예를 들어 Java 파일 업로더 를 사용하면 파일을 빠르고 편리하게 업로드할 수 있습니다.

그러나 파일 업로드를 통해 사이버 범죄자는 맬웨어 또는 기타 유해한 콘텐츠를 시스템에 도입하고 서버를 손상시킬 수 있습니다. 따라서 개발자는 자신의 웹사이트 또는 웹 애플리케이션에 파일 업로드가 안전한지 절대적으로 확인해야 합니다. 안전한 파일 업로드를 설정하려면 안정적인 Java 파일 업로드 SDK를 활용하는 것이 좋습니다.

이 기사에서는 Java를 사용하여 파일 업로더를 빌드하는 방법을 살펴보겠습니다.

Java를 사용하여 파일 업로더를 구현하는 방법은 무엇입니까?

파일 업로더는 사용자가 웹 애플리케이션이나 웹사이트에 파일을 업로드하기 위해 클릭할 수 있는 "제출"에 지나지 않습니다. 그러나 파일 업로더는 개발자에게 훨씬 더 많은 것을 의미합니다.

HTML 형식과 서블릿만 사용하는 간단한 파일 업로더를 만들 수 있습니다. 이 예에서 HTML 양식에는 두 개의 입력 필드가 있습니다. 하나의 입력 필드는 사용자가 자신의 파일을 업로드할 수 있도록 하고 두 번째 입력 필드는 개발자가 파일을 저장할 위치를 알려줍니다.

파일을 포함한 폼 데이터를 서버로 보내기 위해 POST 방식을 취하고 있습니다. 또한 파일 업로드 시 파일에 인쇄할 수 없는 문자가 많이 포함되어 있기 때문에 encrypt=”multipart/form-data”를 사용합니다.

서블릿은 POST 요청을 관리하고 들어오는 파일 데이터를 처리한 후 스트림에서 파일을 추출합니다. 대상은 파일을 저장해야 하는 시스템의 위치를 ​​지정합니다. 업로드 버튼을 누르면 데이터가 서블릿으로 전송되고 서블릿은 파일을 지정된 위치에 저장합니다.

입력 필드가 있는 HTML 파일 만들기

시작하기 전에 따라갈 index.html 파일을 만듭니다.

index.html 에는 다음 코드가 있어야 합니다.

<!DOCTYPE html>
<html lang=”ko”>
<헤드>
<title>자바 파일 업로더</title>
<meta http-equiv=”콘텐츠 유형” content=”텍스트/html; 문자셋=UTF-8″>
</헤드>
<몸>
<form method=”POST” action=”업로드” enctype=”multipart/form-data” >
파일:
<입력 유형=”파일” 이름=”자바 파일” id=”자바 파일” /> <br/>
목적지:
<입력 유형=”텍스트” 값=”/java-folder” 이름=”대상”/>
</br>
<입력 유형=”제출” 값=”제출” 이름=”제출” id=”제출” />
</form>
</body>
</html>

귀하의 페이지는 다음과 같아야 합니다.

파일의 서버 측 처리 처리

서블릿 코드를 작성하기 위해 FileUploadServlet.java라는 파일을 생성합니다. Serlet은 주석을 사용하여 구성 요소 및 메타데이터를 정의합니다. 따라서 @WebServlet 주석은 Java에서 서블릿 구성 요소를 정의하는 데 사용됩니다.

서블릿 주석은 어떤 HttpServlet이 어떤 URL에 대해 실행되어야 하는지를 말해야 합니다. 이를 위해 @WebServlet 주석에서 name 및 ulrPattern 매개변수를 정의합니다. 양식을 제출하면 FileUploadServlet 클래스가 실행될 /upload url로 리디렉션됩니다.

@MultipartConfig 주석은 MIME 유형의 multipart/form-data를 수신할 것임을 서블릿에 알립니다.

이제 전체 코드를 작성해 보겠습니다.

@WebServlet(이름 = "FileUploadServlet" , urlPatterns = { "/업로드" })
@MultipartConfig
공개 클래스 FileUploadServlet 확장 HttpServlet {

개인 최종 정적 로거 LOGGER =
Logger.getLogger(FileUploadServlet.class.getCanonicalName());

보호된 무효 processRequest(HttpServletRequest 요청,
HttpServletResponse 응답)
ServletException, IOException {를 던졌습니다.
response.setContentType( "text/html;charset=UTF-8" );

최종 문자열 dest= request.getParameter( "목적지" );
최종 파트 part = request.getPart( "파일" );
최종 String nameOfFile = getFileName(part);

OutputStream 출력 = null ;
InputStream cont = null ;
최종 PrintWriter printWriter = response.getWriter();

시도 {
out = new FileOutputStream( new File(dest + File.separator)
+ nameOfFile));
cont = part.getInputStream();

정수 판독기 = 0 ;
최종 바이트[] 바이트 = 바이트[ 1024 ];

동안 ((독자 = cont.read(바이트)) != -1 ) {
out.write(bytes, 0 , reader);
}
printWriter.println( "파일 " + nameOfFile + " " + dest에서 생성됨);
LOGGER.log(Level.INFO, "파일{0}이 {1}에 업로드됨" ,
new Object[]{nameOfFile, 대상});
} 잡기 (FileNotFoundException fne) {
printWriter.println( "파일 이름을 언급하지 않았거나 "
+ "존재하지 않는 파일에 업로드 시도 중 "
+ "위치." );
printWriter.println( “<br/> 오류: “ + fne.getMessage());

LOGGER.log(Level.SEVERE, "파일을 업로드하는 동안 오류가 발생했습니다. 오류: {0}" ,
new Object[]{fne.getMessage()});
} 드디어 {
if (out != null ) {
아웃.클로즈();
}
if (계속 != null ) {
cont.close();
}
if (printWriter != null ) {
printWriter.close();
}
}
}

개인 문자열 getFileName(최종 부분 부분) {
최종 문자열 partHeader = part.getHeader( "콘텐츠 배치" );
LOGGER.log(Level.INFO, "파트 헤더 = {0}" , partHeader);
for (문자열 내용: part.getHeader( "내용 처리" ).split( ";" )) {
if (content.trim().startsWith( "파일 이름" )) {
내용을 반환 합니다.하위 문자열(
content.indexOf( '=' ) + 1 ).trim().replace( “\”” , “” );
}
}
null 반환 ;
}
}

processRequest 메서드 getFileName 메서드를 호출 하여 요청에서 대상 및 파일 부분을 검색한 후 파일 부분에서 파일 이름을 가져옵니다. 그런 다음 메서드는 FileOutputStream 을 만들고 파일을 원하는 위치로 전송합니다. 메서드의 오류 처리 부분은 파일을 찾을 수 없음 오류의 가장 빈번한 원인 몇 가지를 감지하고 해결합니다.

코드 배포

이제 프로그램을 빌드하고 실행해야 합니다. 이를 위해 NetBeans, Eclipse, Intellij Idea 등과 같은 선호하는 IDE를 사용할 수 있습니다.

https://cdn.pixabay.com/photo/2016/11/30/20/58/programming-1873854__340.png

NetBeans를 사용하는 경우 Netbeans IDE를 열고 작업 디렉터리로 이동합니다. 문제가 있는 경우 Java의 공식 문서를 참조하십시오. 프로젝트 탭에서 폴더를 마우스 오른쪽 버튼으로 클릭하고 배포를 선택합니다. 다음으로 브라우저에 액세스하고 아래 URL을 입력할 수 있습니다.

http://localhost:8080/{폴더 이름}/

URL을 입력하고 Enter 키를 누르면 위에서 만든 HTML 페이지가 열립니다. 원하는 위치에 파일을 업로드하기 위해 시스템을 검색하고 파일을 선택할 수 있습니다. 대상 영역에 파일을 저장하려는 폴더의 경로를 입력합니다. 디렉토리는 쓰기 가능해야 하고 이미 시스템에 존재해야 합니다. 대상 필드가 비어 있는 상태에서 업로드 버튼을 클릭하면 예외가 발생합니다.

서블릿은 업로드 버튼을 클릭하면 POST 요청을 받고 선택한 파일을 지정된 폴더에 복사합니다.

지정된 폴더를 방문하여 업로드 버튼을 클릭한 후 로드된 파일(예: TextFile.txt)이 있는지 확인할 수 있습니다.

지금까지 우리는 HTML과 Java를 사용하여 간단한 Java 파일 업로더를 만들었습니다. 그러나 "단순"은 많은 기능을 가진 복잡한 업로더가 되므로 중요하지 않은 기능에서 중요한 기능을 추적하기 어려울 수 있습니다. 말할 것도 없이 처음부터 업로더를 구축하는 것을 고려할 때 몇 가지 보안 문제가 있습니다. 따라서 다음 섹션에서는 보안 Filestack SDK를 사용하여 파일을 업로드하는 방법을 안내합니다.

Filestack SDK로 파일을 쉽게 업로드하는 방법

따라하려면 Filestack API 키 가 필요합니다 .

시작하려면 아래 명령을 사용하여 Filestack SDK를 설치하세요.

구현 'com.filestack:filestack-java:0.9.0'

Filestack을 사용하여 업로드 기능을 구현하려면 Java 파일에서 다음 코드를 사용하십시오.

// 클라이언트 생성
구성 구성 = 구성( "API_KEY" );
클라이언트 클라이언트 = 클라이언트(구성);

// 설정 옵션 및 업로드 관련 메타데이터
StorageOptions 옵션 = 새로운 StorageOptions.Builder()
.mimeType( "텍스트/일반" )
.filename( "file.txt" )
.짓다();

// 동기식 업로드 수행
FileLink 파일 = client.upload( "/filepath" , false );

// 비동기 업로드 수행
Flowable<Progress<FileLink>> upload = client.uploadAsync( "파일 경로" , false );
upload.doOnNext( 소비자<Progress<FileLink>>() {
@우세하다
public void accept(Progress<FileLink> progress) 예외 {
System.out.printf( "%f%% 파일이 업로드되었습니다\n" , progress.getPercent());
if (progress.getData() != null ) {
FileLink 파일 = progress.getData();
}
}
});

작동하는지 확인하기 위해 다음 테스트를 실행할 수 있습니다.

./파일 테스트

앱을 배포하려는 경우 Bintray가 배포 대상입니다. 배포하려면 Filestack 조직에 등록된 사용자 계정이 필요합니다. 기본 Filestack 릴리스 지침도 준수하십시오. 환경 변수 "BINTRAY USER" 및 "BINTRAY API KEY"가 필요합니다. 실행하려면:

내보내기 BINTRAY_USER=
내보내기 BINTRAY_API_KEY=
./files bintray업로드

결론

고유한 Java 파일 업로드 시스템을 유지 관리하고 생성하기 어려운 경우 타사 도구를 선택할 수도 있습니다. 데이터 보안 및 개인 정보 보호 문제로 인해 사람들은 예를 들어 의료 기록이 포함된 파일을 업로드할 때 타사 시스템을 사용하지 않을 수 있습니다.

또한 파일 스토리지 인프라에 액세스할 수 있는 사람을 거의 제어할 수 없을 것이라고 걱정합니다. 그러나 신뢰할 수 있는 파일 업로드 솔루션을 활용하여 양식 및 문서 데이터의 보안을 보장할 수 있습니다.

자주 묻는 질문(FAQ)

API를 사용하여 파일을 이동할 수 있습니까?

예. API를 사용하여 파일을 이동하는 것은 시판되는 API 기반 도구를 사용하여 수행할 수 있습니다. 이는 온라인 프로그램과 같은 다양한 플랫폼에서 실행되는 프로그램과도 결합될 수 있습니다.

큰 파일을 REST API에 제출할 수 있습니까?

특히 대역폭 및 네트워크 연결 불량과 같은 다른 요인이 존재하는 경우 대용량 파일을 업로드하기 어려울 수 있습니다. 수많은 업로드 실패가 발생할 수 있습니다.

Java는 업로드된 파일을 어떻게 읽습니까?

입력 스트림을 사용하여 Java 프로그램은 바이트 또는 문자 모음을 읽습니다. 파일 읽기는 파일 개체 구성으로 시작하여 입력 파일에 전달하고 스트림에서 데이터를 읽고 처리한 다음 스트림 및 파일 개체를 닫는 순차적 작업입니다.

파일 업로드 도구란?

웹 애플리케이션에 연결할 수 있고 사용자가 사진, 비디오 및 텍스트 파일을 업로드할 수 있을 뿐만 아니라 일부 기본 수정, 필터 효과 등을 허용할 수 있는 API 또는 플러그인입니다.