2017-05-05 5 views
0

파일을 작업 클래스에 도달 할 때까지 메모리에 보관해야하며 파일을 디스크에 쓰지 않아야합니다. 파일이 디스크에 몇 초간 머무르면 파일이 업로드되는 서버에서 발생할 수있는 악용에 대한 두려움이 있습니다. Struts2 프레임 워크가 파일을 디스크에 임시로 저장하는 하나의 솔루션만을 위해 설정되었다고 생각합니다. 이것은 올바른 가정입니까 아니면 정말 간단한 것을 놓치고 있습니까?Struts 2 파일 업로드를 사용하여 임시 파일을 만들 수 없습니까?

답변

0

나는이 문제를 해결할 수 있기 때문에 업로드 된 파일을 임시로 디스크에 저장하지 말아야한다는 요구 사항을 어떻게 공유했는지 알고 싶습니다.

첫째, 업로드 할 파일의 합리적인 최대 크기에 동의하고 한 번에 하나의 파일 만 업로드 할 수 있도록 허용했습니다. 이 계약을 체결하지 않으면 아래에 요약 된 내 솔루션이 작동하지 않습니다.

내가 사용했던 스트럿트의 플러그인 기능이 있습니다. JarkartaMultiPartRequest 클래스를 기반으로하는 자체 MutiPartRequest 플러그인과 클래스를 만들었습니다. 필자는 파일 시스템에 대한 모든 기록을 주석 처리했습니다. 최대 파일 크기를 10MB로 설정하십시오. 파서의 sizeThreshold를 10MB보다 약간 크게 설정하십시오. sizeThreshold를 maxSize보다 크게 설정하면 업로드 된 파일의 전체 바이트 배열을 보유한 메모리의 항목 하나가 만들어집니다. 그런 다음 HTTP 요청에 사용자 정의 속성을 만들어서 메모리 바이트 배열을 보유하고 있으므로 액션 클래스에서 액세스 할 수 있습니다. 바이트 배열을 찾을 수있는 다른 방법은 없었습니다.

내가해야 할 몇 가지 정리 항목이 있었지만 전반적으로 접근 방식이 잘 작동하는 것처럼 보였습니다.

0

내가 생각할 수있는 한 가지 방법은 파일 시스템의 디렉토리 (예 : /tmp)에 struts.multipart.saveDir을 설정하고 해당 디렉토리를 메모리 기반 저장소로 마운트하는 것입니다. 그러면 아무 것도 디스크에 저장되지 않습니다.

작지만주의해야 할 점 : 파일 시스템이 메모리를 지원한다고해도 일부는 저수준 OS 메커니즘 (예 : 페이징)에 의해 디스크에 기록 될 수 있습니다. 그러나 이는 메모리 지원 파일 시스템뿐만 아니라 메모리에 저장하는 모든 것에 해당됩니다. 이 저장소가 절대적으로 메모리에 남아 있어야하고 페이징 된 적이없는 경우 조금 더 창조적으로 파일 시스템이 지원하는 메모리가 항상 "상주"여야합니다.

+0

디스크에 저장하지 말아야한다는 매우 창의적인 방법입니다. 문제는 파일처럼 보이고 파일처럼 액세스 할 수있는 경우에 통과하지 못하는 것입니다. –