1. IO 2.11.0
2. FileUpload 1.4
파일 업로드
FileUpload
1. pom.xml 에 라이브러리 추가
<!-- commons-io : 파일 업로드 필요-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- fileupload : 파일 업로드 필요-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2. servlet-context.xml
파란색 - 클래스안에있는 메소드 , 이름에 오타가 생기면 안된다.
<!-- 파일 업로드할 Resolver를 객체 생성함 -->
<beans:bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="10240000"/> <!-- 10메가 -->
<beans:property name="maxInMemorySize" value="1024000"/>
<beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>
</beans:beans>
CustomViewController
// 파일 업로드
// 전송누르면 upload.action으로 감 , 기본이 get방식
// String str 정보
// C:\sts-bundle\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringWebView\WEB-INF\files
@RequestMapping(value="/upload.action",method= {RequestMethod.POST,RequestMethod.GET})
public String upload(MultipartHttpServletRequest request, String str)
throws Exception {
// savefile : file이라는 클래스를 사용해서 사용자가 path를 주게되면 path를 받아서 save위치 저장에 폴더를 만듬
// 1. 파일 경로를 받음
String path = request.getSession()
.getServletContext().getRealPath("/WEB-INF/files");
/*
WEB-INF는보안이 막강해서 외부에서 접근 금지 영역이기때문에(파일을엑세스못함)
// 하지만 안에 views는 엑세스가 가능
이미지를 보기위해서 webapp 폴더 아래 폴더(image)를 만들거나
resources폴더에 만들어준다.
getServletContext().getRealPath("/resources/image"); -- webapp-resources 아래
getServletContext().getRealPath("/image"); -- webapp 아래
*/
// image 폴더를 만든 경우 servlet-context.xml에서
// <resources mapping="/resources/**" location="/resources/" /> 를
// <resources mapping="/** location="/"> 수정해줘야한다.(web-app모두인식해줘야하므로)
// String path = cp + "/resources/image 로 경로 넘김
// 2. 업로드에 있는 내용을 그대로 받아옴
MultipartFile file = request.getFile("upload"); // input : upload 이름을 적어줌
// 3. 파일이 있을때만 실행
if(file!=null && file.getSize()>0) {
try {
// 4. 파일 내보낼 위치 정함
FileOutputStream fos =
new FileOutputStream(path + "/" + file.getOriginalFilename());
// 5. is는 읽어드릴곳
InputStream is = file.getInputStream();
int data;
byte[] buffer = new byte[4096];
// 6. buffer의 0에서부터 크기만큼 -1일떄까지 내보냄 fos에다가 적는다.
while((data=is.read(buffer,0,buffer.length))!=-1) {
fos.write(buffer,0,data);
}
is.close();
fos.close();
} catch (Exception e) {
System.out.println(e.toString());
}
}
//7. 넘어갈 페이지
return "uploadResult";
}
C:\sts-bundle\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SpringWebView\WEB-INF\files
파일 업로드된 경로이다.
파일 다운로드
CustomViewController
@RequestMapping(value = "/download.action")
public ModelAndView download() {
ModelAndView mav = new ModelAndView();
mav.setView(new DownloadView());
return mav;
}
DownloadView
package com.exe.springwebview;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.AbstractView;
// 다운로드 기능
public class DownloadView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
// abc.txt 파일이름.확장자
response.setContentType("application/octet-stream");
// response.setContentType("application/unknown"); 파일형식모를때 이렇게 써도됨
// 다운로드 받을때
// 업로드된 파일이름을 적는다.
// header에 저장
response.addHeader("Content-Disposition",
"attachment;fileName=\"20220318_220549.png\"");
String path = request.getSession()
.getServletContext().getRealPath("/WEB-INF/files/20220318_220549.png");
// 읽는건 서버가 읽어내므로 WEB-INF에 접근 가능
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream(path));
// header 에 저장된걸 내보낸다.
BufferedOutputStream bos =
new BufferedOutputStream(response.getOutputStream());
int data;
while((data=bis.read())!=-1) {
bos.write(data);
}
bis.close();
bos.close();
}
}
○ 다운로드 처리 순서
1. 브라우저에게 처리할 수 없는 컨테츠라고 알려준다.
→ 브라우저가 처리할 수 없어 다운로드를 실행
- 둘 중 하나를 사용
response.setContentType("application/octet-stream");
response.setContentType("application/unknown");
2. 다운로드 처리할 때 필요한 정보를 제공한다
3. 파일 응답 스트림에 기록한다
4. 파일 다운로드를 실행한다
'BACKEND > 스프링 Spring' 카테고리의 다른 글
Spring MVC 패턴 구조 (0) | 2023.12.17 |
---|---|
root-context.xml , web.xml , dispatcher-servlet.xml , pom.xml 설정 이유 (0) | 2023.12.17 |
[spring3.0] 게시판 3.0 Spring Web View (0) | 2022.03.30 |
[spring3.0] 스프링3.0게시판 스프링 JDBC로 변경하기 (0) | 2022.03.29 |
[spring3.0] 스프링3.0 과 마이바티스를 이용하여 게시판 만들기 (0) | 2022.03.29 |