JSP / Servlet을 사용하여 서버에 파일을 업로드하는 방법은 무엇입니까?
JSP / Servlet을 사용하여 서버에 파일을 업로드하려면 어떻게해야합니까? 나는 이것을 시도했다 :
<form action="upload" method="post">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
그러나 파일 내용이 아닌 파일 이름 만 얻습니다. 내가 추가 할 때 enctype="multipart/form-data"
받는 <form>
후 request.getParameter()
반환 null
.
연구 중에 Apache Common FileUpload를 우연히 발견했습니다 . 나는 이것을 시도했다 :
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.
불행히도 서블릿은 명확한 메시지와 원인없이 예외를 던졌습니다. 다음은 스택 추적입니다.
SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:637)
소개
업로드 할 파일을 찾아보고 선택하려면 <input type="file">
양식에 HTML 필드 가 필요합니다 . HTML 사양에 명시된대로 POST
메서드 를 사용해야 enctype
하고 양식 의 속성을로 설정해야 "multipart/form-data"
합니다.
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
이러한 양식을 제출 한 후 이진 멀티 파트 양식 데이터는 이 설정되지 않은 경우와 다른 형식으로 요청 본문에서 사용할 수 있습니다 enctype
.
Servlet 3.0 이전에는 Servlet API가 기본적으로 multipart/form-data
. 기본 양식 enctype 만 지원합니다 application/x-www-form-urlencoded
. request.getParameter()
및 배우자들 모두 반환 null
멀티 폼 데이터를 사용하는 경우. 여기에서 잘 알려진 Apache Commons FileUpload 가 등장했습니다.
수동으로 파싱하지 마십시오!
이론적으로를 기반으로 요청 본문을 직접 구문 분석 할 수 있습니다 ServletRequest#getInputStream()
. 그러나 이것은 RFC2388에 대한 정확한 지식이 필요한 정확하고 지루한 작업입니다 . 혼자서이 작업을 수행하거나 인터넷의 다른 곳에서 찾을 수있는 자체 개발 한 라이브러리없는 코드를 복사하여 붙여 넣지 마십시오. roseindia.net과 같은 많은 온라인 소스가 이것에 대해 열심히 실패했습니다. pdf 파일 업로드를 참조하십시오 . 수백만 명의 사용자가 사용하는 (암시 적으로 테스트 된!) 실제 라이브러리를 사용해야합니다. 이러한 라이브러리는 견고 함이 입증되었습니다.
이미 Servlet 3.0 이상을 사용 중이면 기본 API를 사용하십시오.
Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3 등) 이상을 사용 HttpServletRequest#getPart()
하는 경우 제공된 표준 API를 사용 하여 개별 멀티 파트 양식 데이터 항목을 수집 할 수 있습니다 (대부분의 Servlet 3.0 구현은 실제로 Apache를 사용합니다. 이를 위해 Commons FileUpload!). 또한 일반 양식 필드는 getParameter()
일반적인 방법으로 사용할 수 있습니다 .
먼저 서블릿이 요청을 @MultipartConfig
인식하고 지원 하여 작동 하도록하기 위해 서블릿에 주석을 추가합니다 .multipart/form-data
getPart()
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
// ...
}
그런 doPost()
다음 다음과 같이 구현하십시오 .
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
InputStream fileContent = filePart.getInputStream();
// ... (do your job here)
}
를 참고 Path#getFileName()
. 이것은 파일 이름을 얻기위한 MSIE 수정 사항입니다. 이 브라우저는 파일 이름 만이 아닌 이름과 함께 전체 파일 경로를 잘못 보냅니다.
경우에 당신은이 <input type="file" name="file" multiple="true" />
멀티 파일 업로드 아래로 수집 (불행하게도 그런 방법으로는 없다 request.getParts("file")
)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">
for (Part filePart : fileParts) {
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
InputStream fileContent = filePart.getInputStream();
// ... (do your job here)
}
}
아직 Servlet 3.1이 아닌 경우 제출 된 파일 이름을 수동으로 가져옵니다.
주 Part#getSubmittedFileName()
서블릿 3.1 (톰캣 8 부두 9 제이보스 8 글래스 피쉬 4 등)에 도입 하였다. 아직 Servlet 3.1을 사용하고 있지 않다면 제출 된 파일 이름을 얻으려면 추가 유틸리티 메서드가 필요합니다.
private static String getSubmittedFileName(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
}
}
return null;
}
String fileName = getSubmittedFileName(filePart);
파일 이름을 얻으려면 MSIE 수정 사항을 참고하십시오. 이 브라우저는 파일 이름 만이 아닌 이름과 함께 전체 파일 경로를 잘못 보냅니다.
아직 Servlet 3.0을 사용하지 않는 경우 Apache Commons FileUpload를 사용하십시오.
아직 Servlet 3.0을 사용하지 않는 경우 (업그레이드 할시기가 아닙니까 ?) 일반적인 관행은 Apache Commons FileUpload 를 사용 하여 여러 부분 양식 데이터 요청을 구문 분석하는 것입니다. 그것은 훌륭한 사용자 가이드 와 FAQ를 가지고 있습니다 (둘 다주의 깊게 살펴보십시오). O'Reilly ( " cos ") MultipartRequest
도 있지만 몇 가지 (사소한) 버그가 있으며 수년 동안 더 이상 유지 관리되지 않습니다. 나는 그것을 사용하지 않는 것이 좋습니다. Apache Commons FileUpload는 여전히 활발히 유지되고 있으며 현재 매우 성숙합니다.
Apache Commons FileUpload를 사용하려면 웹앱에 최소한 다음 파일이 있어야합니다 /WEB-INF/lib
.
커먼즈 IO를 잊어 버렸기 때문에 초기 시도가 실패했을 가능성이 큽니다.
여기에 어떻게 킥오프 예입니다 doPost()
당신의이 UploadServlet
아파치 코 몬즈는 FileUpload를 사용할 때처럼 보일 수는 :
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// Process regular form field (input type="text|radio|checkbox|etc", select, etc).
String fieldName = item.getFieldName();
String fieldValue = item.getString();
// ... (do your job here)
} else {
// Process form file field (input type="file").
String fieldName = item.getFieldName();
String fileName = FilenameUtils.getName(item.getName());
InputStream fileContent = item.getInputStream();
// ... (do your job here)
}
}
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}
// ...
}
그것은 당신이 전화를하지 않는 것이 매우 중요합니다 getParameter()
, getParameterMap()
, getParameterValues()
, getInputStream()
, getReader()
사전에 동일한 요청에 등. 그렇지 않으면 서블릿 컨테이너가 요청 본문을 읽고 구문 분석하므로 Apache Commons FileUpload는 빈 요청 본문을 가져옵니다. 참조 ao ServletFileUpload # parseRequest (request) returns an empty list .
를 참고 FilenameUtils#getName()
. 이것은 파일 이름을 얻기위한 MSIE 수정 사항입니다. 이 브라우저는 파일 이름 만이 아닌 이름과 함께 전체 파일 경로를 잘못 보냅니다.
또는이 모든 Filter
것을 자동으로 파싱하고 요청의 parametermap에 항목을 다시 넣어 request.getParameter()
일반적인 방법으로 계속 사용 하고 request.getAttribute()
. 이 블로그 기사에서 예제를 찾을 수 있습니다 .
getParameter()
여전히 반환 되는 GlassFish3 버그에 대한 해결 방법null
3.1.2 이전의 글래스 피시 버전을 가지고 있습니다 버그를 상기 getParameter()
여전히 돌아갑니다 null
. 이러한 컨테이너를 대상으로하고 업그레이드 할 수없는 경우 다음 getPart()
유틸리티 메서드 를 사용하여 값을 추출해야합니다 .
private static String getValue(Part part) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
StringBuilder value = new StringBuilder();
char[] buffer = new char[1024];
for (int length = 0; (length = reader.read(buffer)) > 0;) {
value.append(buffer, 0, length);
}
return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">
업로드 된 파일 저장 (사용 getRealPath()
하지 part.write()
마세요!)
얻은 InputStream
( fileContent
위의 코드 조각에 표시된 변수)를 디스크 또는 데이터베이스 에 올바르게 저장하는 방법에 대한 자세한 내용은 다음 답변으로 이동하십시오 .
- 서블릿 애플리케이션에 업로드 된 파일을 저장하는 권장 방법
- 이미지를 업로드하고 데이터베이스에 저장하는 방법은 무엇입니까?
- Part를 Blob으로 변환하여 MySQL에 저장하는 방법은 무엇입니까?
업로드 된 파일 제공
디스크 또는 데이터베이스에서 클라이언트로 다시 저장된 파일을 올바르게 제공하는 방법에 대한 자세한 내용은 다음 답변을 참조하십시오.
- <h : graphicImage> 또는 <img> 태그를 사용하여 webapps / webcontext / deploy 폴더 외부에서 이미지로드
- JSP 페이지의 데이터베이스에서 이미지를 검색하고 표시하는 방법은 무엇입니까?
- Java 웹 애플리케이션의 애플리케이션 서버 외부에서 정적 데이터를 제공하는 가장 간단한 방법
- HTTP 캐싱을 지원하는 정적 리소스 서블릿에 대한 추상 템플릿
양식 Ajaxifying
Ajax (및 jQuery)를 사용하여 업로드하는 방법은 다음 답변으로 이동하십시오. 이를 위해 양식 데이터를 수집하는 서블릿 코드를 변경할 필요가 없습니다. 응답하는 방식 만 변경 될 수 있지만 이것은 다소 사소한 것입니다 (예 : JSP로 전달하는 대신 Ajax 호출을 담당하는 스크립트가 기대하는 것에 따라 JSON 또는 XML 또는 일반 텍스트를 인쇄하십시오).
- JSP / Servlet 및 Ajax를 사용하여 서버에 파일을 업로드하는 방법은 무엇입니까?
- xmlHttpRequest를 통해 멀티 파트로 파일 보내기
- Java Servlet에 HTML5 파일 업로드
이 모든 것이 도움이되기를 바랍니다. :)
Spring MVC를 사용하는 경우 다음 방법을 사용합니다. (누군가가 유용하다고 생각할 경우를 대비하여 여기에 남겨 둡니다).
enctype
속성이 " multipart/form-data
"로 설정된 양식 사용 (BalusC의 답변과 동일)
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload"/>
</form>
컨트롤러에서 다음과 같이 요청 매개 변수 file
를 MultipartFile
유형에 매핑합니다 .
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
if (!file.isEmpty()) {
byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
// application logic
}
}
MultipartFile
의 getOriginalFilename()
및을 사용하여 파일 이름과 크기를 얻을 수 있습니다 getSize()
.
나는 이것을 Spring 버전으로 테스트했다 4.1.1.RELEASE
.
당신은 필요 common-io.1.4.jar
당신에 포함 할 파일을 lib
디렉토리, 또는 어떤 편집기에서 작업하는 경우, 넷빈즈처럼, 당신은 프로젝트 속성에 가서 바로 JAR 파일을 추가 할 필요가 당신이 수행됩니다.
common.io.jar
파일 을 얻으려면 Google로 이동하거나 Apache Tomcat 웹 사이트로 이동하여이 파일을 무료로 다운로드 할 수 있습니다. 하지만 한 가지 기억하세요. Windows 사용자라면 바이너리 ZIP 파일을 다운로드하세요.
첨부 파일이 있든 없든 모든 Html 양식에 공통 서블릿을 사용 하고 있습니다. 이 서블릿은 TreeMap
키가 jsp 이름 인 곳을 반환합니다 . 매개 변수 및 값은 사용자 입력이며 고정 된 디렉토리에 모든 첨부 파일을 저장하고 나중에 선택한 디렉토리의 이름을 바꿉니다. Here Connections는 연결 개체가있는 사용자 정의 인터페이스입니다. 나는 이것이 당신을 도울 것이라고 생각합니다
public class ServletCommonfunctions extends HttpServlet implements
Connections {
private static final long serialVersionUID = 1L;
public ServletCommonfunctions() {}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {}
public SortedMap<String, String> savefilesindirectory(
HttpServletRequest request, HttpServletResponse response)
throws IOException {
// Map<String, String> key_values = Collections.synchronizedMap( new
// TreeMap<String, String>());
SortedMap<String, String> key_values = new TreeMap<String, String>();
String dist = null, fact = null;
PrintWriter out = response.getWriter();
File file;
String filePath = "E:\\FSPATH1\\2KL06CS048\\";
System.out.println("Directory Created ????????????"
+ new File(filePath).mkdir());
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
// Verify the content type
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File(filePath));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax(maxFileSize);
try {
// Parse the request to get file items.
@SuppressWarnings("unchecked")
List<FileItem> fileItems = upload.parseRequest(request);
// Process the uploaded file items
Iterator<FileItem> i = fileItems.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (!fi.isFormField()) {
// Get the uploaded file parameters
String fileName = fi.getName();
// Write the file
if (fileName.lastIndexOf("\\") >= 0) {
file = new File(filePath
+ fileName.substring(fileName
.lastIndexOf("\\")));
} else {
file = new File(filePath
+ fileName.substring(fileName
.lastIndexOf("\\") + 1));
}
fi.write(file);
} else {
key_values.put(fi.getFieldName(), fi.getString());
}
}
} catch (Exception ex) {
System.out.println(ex);
}
}
return key_values;
}
}
Tomcat 6 o 7의 구성 요소 또는 외부 라이브러리 없음
web.xml 파일 에서 업로드 활성화 :
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<multipart-config>
<max-file-size>3145728</max-file-size>
<max-request-size>5242880</max-request-size>
</multipart-config>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
당신이 볼 수 있듯이 :
<multipart-config>
<max-file-size>3145728</max-file-size>
<max-request-size>5242880</max-request-size>
</multipart-config>
JSP를 사용하여 파일 업로드. 파일 :
html 파일에서
<form method="post" enctype="multipart/form-data" name="Form" >
<input type="file" name="fFoto" id="fFoto" value="" /></td>
<input type="file" name="fResumen" id="fResumen" value=""/>
JSP 파일 또는 서블릿에서
InputStream isFoto = request.getPart("fFoto").getInputStream();
InputStream isResu = request.getPart("fResumen").getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[8192];
int qt = 0;
while ((qt = isResu.read(buf)) != -1) {
baos.write(buf, 0, qt);
}
String sResumen = baos.toString();
max-file-size , max-request-size 및 설정할 수있는 기타 옵션과 같은 서블릿 요구 사항에 맞게 코드를 편집합니다 .
Spring MVC의 경우 몇 시간 동안 노력해 왔으며 데이터와 이미지 모두를 입력하는 데 사용할 수있는 더 간단한 버전을 관리했습니다.
<form action="/handleform" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="text" name="age" />
<input type="file" name="file" />
<input type="submit" />
</form>
처리 할 컨트롤러
@Controller
public class FormController {
@RequestMapping(value="/handleform",method= RequestMethod.POST)
ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
throws ServletException, IOException {
System.out.println(name);
System.out.println(age);
if(!file.isEmpty()){
byte[] bytes = file.getBytes();
String filename = file.getOriginalFilename();
BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
stream.write(bytes);
stream.flush();
stream.close();
}
return new ModelAndView("index");
}
}
도움이되기를 바랍니다 :)
이 문제의 또 다른 원인은 내장 된 Tomcat과 함께 Geronimo를 사용하는 경우 발생합니다. 이 경우 commons-io 및 commons-fileupload 테스트를 여러 번 반복 한 후 commons-xxx jar를 처리하는 상위 클래스 로더에서 문제가 발생합니다. 이것은 방지되어야합니다. 충돌은 항상 다음에서 발생했습니다.
fileItems = uploader.parseRequest(request);
Note that the List type of fileItems has changed with the current version of commons-fileupload to be specifically List<FileItem>
as opposed to prior versions where it was generic List
.
I added the source code for commons-fileupload and commons-io into my Eclipse project to trace the actual error and finally got some insight. First, the exception thrown is of type Throwable not the stated FileIOException nor even Exception (these will not be trapped). Second, the error message is obfuscatory in that it stated class not found because axis2 could not find commons-io. Axis2 is not used in my project at all but exists as a folder in the Geronimo repository subdirectory as part of standard installation.
마지막으로 내 문제를 성공적으로 해결 한 작업 솔루션을 제시 한 1 곳을 찾았습니다. 배치 계획의 상위 로더에서 jar를 숨겨야합니다. 이것은 아래에 표시된 전체 파일과 함께 geronimo-web.xml에 저장되었습니다.
Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
<dep:environment>
<dep:moduleId>
<dep:groupId>DataStar</dep:groupId>
<dep:artifactId>DataStar</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>car</dep:type>
</dep:moduleId>
<!--Don't load commons-io or fileupload from parent classloaders-->
<dep:hidden-classes>
<dep:filter>org.apache.commons.io</dep:filter>
<dep:filter>org.apache.commons.fileupload</dep:filter>
</dep:hidden-classes>
<dep:inverse-classloading/>
</dep:environment>
<web:context-root>/DataStar</web:context-root>
</web:web-app>
다음은 apache commons-fileupload를 사용하는 예입니다.
// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
.filter(e ->
"the_upload_name".equals(e.getFieldName()))
.findFirst().get();
String fileName = item.getName();
item.write(new File(dir, fileName));
log.info(fileName);
jsp / servlet을 사용하여 파일을 업로드 할 수 있습니다.
<form action="UploadFileServlet" method="post">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
반면에 서버 측. 다음 코드를 사용하십시오.
package com.abc..servlet;
import java.io.File;
---------
--------
/**
* Servlet implementation class UploadFileServlet
*/
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadFileServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.sendRedirect("../jsp/ErrorPage.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
HttpSession httpSession = request.getSession();
String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;
String path1 = filePathUpload;
String filename = null;
File path = null;
FileItem item=null;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
String FieldName = "";
try {
List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
item = (FileItem) iterator.next();
if (fieldname.equals("description")) {
description = item.getString();
}
}
if (!item.isFormField()) {
filename = item.getName();
path = new File(path1 + File.separator);
if (!path.exists()) {
boolean status = path.mkdirs();
}
/* START OF CODE FRO PRIVILEDGE*/
File uploadedFile = new File(path + Filename); // for copy file
item.write(uploadedFile);
}
} else {
f1 = item.getName();
}
} // END OF WHILE
response.sendRedirect("welcome.jsp");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
DiskFileUpload upload=new DiskFileUpload();
이 개체에서 파일 항목과 필드를 가져와야 다음과 같이 서버에 저장할 수 있습니다.
String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);
우리가 사용해야하는 파일에 대해 여러 파일 enctype="multipart/form-data"
을 보내고 multiple="multiple"
입력 태그에 여러 파일 사용을 보내기 위해
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="fileattachments" multiple="multiple"/>
<input type="submit" />
</form>
HTML 페이지
<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="UploadServlet" method="post"
enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
서비스 파일
// Import required java libraries
import java.io.*;
import java.util.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;
public class UploadServlet extends HttpServlet {
private boolean isMultipart;
private String filePath;
private int maxFileSize = 50 * 1024;
private int maxMemSize = 4 * 1024;
private File file ;
public void init( ){
// Get the file location where it would be stored.
filePath =
getServletContext().getInitParameter("file-upload");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
// Check that we have a file upload request
isMultipart = ServletFileUpload.isMultipartContent(request);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
if( !isMultipart ){
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File("c:\\temp"));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax( maxFileSize );
try{
// Parse the request to get file items.
List fileItems = upload.parseRequest(request);
// Process the uploaded file items
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
while ( i.hasNext () )
{
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () )
{
// Get the uploaded file parameters
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// Write the file
if( fileName.lastIndexOf("\\") >= 0 ){
file = new File( filePath +
fileName.substring( fileName.lastIndexOf("\\"))) ;
}else{
file = new File( filePath +
fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
fi.write( file ) ;
out.println("Uploaded Filename: " + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
}catch(Exception ex) {
System.out.println(ex);
}
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, java.io.IOException {
throw new ServletException("GET method used with " +
getClass( ).getName( )+": POST method required.");
}
}
web.xml
위의 서블릿 UploadServlet을 컴파일하고 다음과 같이 web.xml 파일에 필수 항목을 생성합니다.
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
참고 URL : https://stackoverflow.com/questions/2422468/how-to-upload-files-to-server-using-jsp-servlet
'Nice programing' 카테고리의 다른 글
문자열에서 마지막 문자 제거 (0) | 2020.09.30 |
---|---|
GitHub 오류 메시지-권한이 거부되었습니다 (공개 키). (0) | 2020.09.30 |
목록 이해와지도 (0) | 2020.09.30 |
git reset --mixed, --soft 및 --hard의 차이점은 무엇입니까? (0) | 2020.09.30 |
이상한 원치 않는 Xcode 로그 숨기기 (0) | 2020.09.30 |