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 사양에 기재되어 있는 바와 같이,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
설정되지 않았습니다.
3.0) 으로 Servlet 3.0(2009년 12월)을 지원하지 multipart/form-data
. 인 . application/x-www-form-urlencoded
. 。request.getParameter()
.null
멀티파트 폼 데이터 사용 시.여기서 유명한 Apache Commons FileUpload가 등장했습니다.
수동으로 구문 분석하지 마세요!
이론적으로 요청 본문은 에 근거하여 해석할 수 있습니다.단, 이것은 RFC2388에 대한 정확한 지식이 필요한 정확하고 지루한 작업입니다.이것을 스스로 실행하려고 하거나 인터넷상의 다른 장소에서 볼 수 있는 자체 개발한 라이브러리리스 코드를 카피 페이스트 하지 말아 주세요.roseindia.net과 같은 많은 온라인 소스가 이 문제에 대해 심각한 장애를 겪고 있습니다.PDF 파일의 업로드를 참조해 주세요.수백만 명의 사용자가 수년간 사용하고 있는(암묵적으로 테스트된!) 실제 라이브러리를 사용하는 것이 좋습니다.이런 도서관은 그 견고함을 증명했다.
이미 Servlet 3.0 이상을 사용하고 있는 경우 네이티브 API를 사용합니다.
최소한 Servlet 3.0(Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3 등)을 사용하고 있다면 제공된 표준 API를 사용하여 개별 멀티파트 형식 데이터 항목을 수집할 수 있습니다(대부분의 Servlet 3.0 구현에서는 실제로 Apache Commons FileUpload를 사용합니다).또한 일반 양식 필드는 다음과 같이 사용할 수 있습니다.getParameter()
여느 때처럼
먼저 서블릿이 인식 및 지원되도록 서블릿에 주석을 추가합니다.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를 사용하다이 브라우저는 파일 이름뿐만 아니라 이름을 따라 전체 파일 경로를 잘못 보냅니다.
를 여러 multiple="true"
,
<input type="file" name="files" multiple="true" />
구식 입력 방식일 수도 있고
<input type="file" name="files" />
<input type="file" name="files" />
<input type="file" name="files" />
...
다음과 수 즉, 이런 ).request.getParts("files")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
List<Part> fileParts = request.getParts().stream().filter(part -> "files".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList()); // Retrieves <input type="file" name="files" 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을 사용하지 않은 경우 수동으로 제출 파일 이름 가져오기
서블릿 3.1에서 소개된 점에 유의하십시오(Tomcat 8, Jetty 9, WildFly 8, GlassFish 4 등은 2013년부터 이미 존재합니다).아직 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을 사용하지 않으셨다면 (업그레이드할 때가 되지 않았습니까?)10년 이상 전에 출시되었습니다!)라고 하는 일반적인 방법은 Apache Commons FileUpload를 사용하여 다중 부품 폼 데이터 요청을 구문 분석하는 것입니다.뛰어난 유저 가이드와 FAQ가 준비되어 있습니다(양쪽을 주의 깊게 참조해 주세요).오라일리(cos)도 있다.MultipartRequest
, 몇 가지 몇 않습니다.나는 그것을 사용하는 것을 추천하지 마세요.Apache Commons File Upload 。
Commons 의 Apache Commons FileUpload에 ./WEB-INF/lib
:
아마도 공통 IO를 잊어버렸기 때문에 초기 시도가 실패했습니다.
시작 예가 doPost()
UploadServlet
Apache Commons File Upload 。
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는 빈 요청 본문을 가져옵니다.a.o도 참조해 주세요.Servlet FileUpload#parseRequest(request)는 빈 목록을 반환합니다.
해 주세요.FilenameUtils#getName()
MSIE를 사용하다이 브라우저는 파일 이름뿐만 아니라 이름을 따라 전체 파일 경로를 잘못 보냅니다.
이 a a a a a a a a a a a a a a로 묶을 도 있습니다.Filter
맵에 에 계속 할 수 .request.getParameter()
, 해 주세요.request.getAttribute()
이 블로그 기사에서 예를 찾을 수 있습니다.
GlassFish 3 :getParameter()
돌아오다null
3.1.2보다 이전 버전의 Glassfish에는 다음 버그가 있습니다.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
(the)fileContent
변수)를 디스크 또는 데이터베이스로 전송합니다.
업로드된 파일을 처리하고 있습니다.
디스크 또는 데이터베이스에서 클라이언트에 저장된 파일을 올바르게 제공하는 방법에 대한 자세한 내용은 다음 답변으로 이동하십시오.
- <h: graphic Image> 또는 <img> 태그를 사용하여 webapps/webcontext/deploy 폴더 외부에서 이미지를 로드합니다.
- JSP 페이지에서 데이터베이스에서 이미지를 가져오고 표시하려면 어떻게 해야 합니까?
- Java 웹 응용 프로그램에서 응용 프로그램 서버 외부에서 정적 데이터를 처리하는 가장 간단한 방법
- HTTP 캐싱을 지원하는 정적 리소스 서블릿용 추상 템플릿
폼 에이잭스화
Ajax(및 jQuery)를 사용하여 업로드하는 방법은 다음과 같습니다.이를 위해 양식 데이터를 수집하기 위한 서블릿 코드를 변경할 필요가 없습니다!응답 방법을 변경하는 것 뿐이지만, 이것은 다소 사소한 것입니다(즉, Ajax 콜을 담당하는 스크립트가 기대하는 내용에 따라 JSON 또는 XML 또는 플레인텍스트를 출력하는 것).
- JSP/Servlet 및 Ajax를 사용하여 서버에 파일을 업로드하려면 어떻게 해야 합니까?
- XMLHttpRequest를 통해 파일을 멀티파트로서 송신합니다.
- HTML5 Java Servlet에 파일 업로드
이 모든 것이 도움이 되기를 바랍니다:)
Spring MVC를 사용하는 경우 다음과 같이 하십시오(다른 사용자가 유용하다고 생각할 수 있으므로 여기에 둡니다).
에 ''를 붙여서 하세요.enctype
을 "Attribute"로합니다.multipart/form-data
(BalusC의 답변과 동일)
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload"/>
</form>
parameter 「」를 .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()
.
버전 봄으로 시험해 4.1.1.RELEASE
.
Tomcat 6 또는 Tomcat 7에 구성 요소 또는 외부 라이브러리 없음
web.xml 파일에서 업로드 활성화:
수동으로 PHP, Tomcat 및 Httpd Lounge를 설치합니다.
<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 및 설정할 수 있는 기타 옵션과 같은 서블릿 요구 사항에 맞게 코드를 편집합니다.
★★★★★★★★★★★★★★★★가 필요합니다.common-io.1.4.jar
에 lib
디렉토리 또는 NetBeans 등의 에디터에서 작업하는 경우 프로젝트 속성으로 이동하여 JAR 파일을 추가하면 완료됩니다.
「 」를 common.io.jar
파일을 구글로 검색하거나 Apache Tomcat 웹사이트에 접속하면 이 파일을 무료로 다운로드할 수 있습니다.다만, Windows 유저라면 바이너리 ZIP 파일을 다운로드해 주세요.
첨부파일 유무에 관계없이 HTML 양식마다 공통 Servlet을 사용하고 있습니다.
은 "Servlet" a를 합니다.TreeMap
여기서 키는 JSP name 파라미터, 값은 사용자 입력으로 모든 첨부파일을 고정 디렉토리에 저장한 후 선택한 디렉토리의 이름을 변경합니다.여기서 Connections는 Connection 객체가 있는 커스텀인터페이스입니다
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;
}
}
봄 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-file upload 테스트를 여러 번 반복한 후 commons-xx JAR 파일을 처리하는 부모 클래스 로더에서 문제가 발생합니다.이것은 방지되어야 한다.충돌은 항상 다음 시간에 발생했습니다.
fileItems = uploader.parseRequest(request);
of 에서 commons-fileupload로 되었습니다.List<FileItem>
버전이었던 List
.
실제 오류를 추적하기 위해 Commons-file upload와 Commons IO를 위한 소스 코드를 이클립스 프로젝트에 추가했고 마침내 통찰력을 얻었습니다.첫째, 던져진 예외는 지정된 파일이 아닌 던질 수 있는 유형입니다.IOException도 예외도 마찬가지입니다(이것들은 트랩되지 않습니다).둘째, 에러 메시지는 axis2가 commons-io를 찾을 수 없었기 때문에 class not found라고 기재되어 있어 난독성이 있습니다.Axis2는 제 프로젝트에서 전혀 사용되지 않지만 Geronimo 저장소 서브디렉토리에 폴더로 표준 설치의 일부로 존재합니다.
마침내, 나는 나의 문제를 성공적으로 해결할 수 있는 효과적인 해결책을 제시하는 한 곳을 찾았다.배포 계획에서 부모 로더에서 JAR 파일을 숨겨야 합니다.이것은 아래와 같이 제 풀파일로 geronimo-web.xml파일에 저장되었습니다.
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);
먼저 양식의 enctype 속성을 "멀티파트/폼 데이터"로 설정해야 합니다.
이것은 다음과 같습니다.
<form action="Controller" method="post" enctype="multipart/form-data">
<label class="file-upload"> Click here to upload an Image </label>
<input type="file" name="file" id="file" required>
</form>
그런 다음 Servlet "컨트롤러"에서 다중 부품에 대한 주석을 추가하여 다중 부품 데이터가 서블릿에서 처리되었음을 나타냅니다.
이 작업을 수행한 후 양식을 통해 전송된 부품을 검색한 다음 제출된 파일의 파일 이름(경로 포함)을 검색합니다.이를 통해 원하는 경로에 새 파일을 만들고 파일의 일부를 새로 만든 파일에 기록하여 파일을 다시 만듭니다.
아래와 같이
@MultipartConfig
public class Controller extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
insertImage(request, response);
}
private void addProduct(HttpServletRequest request, HttpServletResponse response) {
Part filePart = request.getPart("file");
String imageName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
String imageSavePath = "specify image path to save image"; //path to save image
FileOutputStream outputStream = null;
InputStream fileContent = null;
try {
outputStream = new FileOutputStream(new File(imageSavePath + File.separator + imageName));
// Creating a new file with file path and the file name
fileContent = filePart.getInputStream();
// Getting the input stream
int readBytes = 0;
byte[] readArray = new byte[1024];
// Initializing a byte array with size 1024
while ((readBytes = fileContent.read(readArray)) != -1) {
outputStream.write(readArray, 0, readBytes);
} // This loop will write the contents of the byte array unitl the end to the output stream
} catch (Exception ex) {
System.out.println("Error Writing File: " + ex);
} finally {
if (outputStream != null) {
outputStream.close();
// Closing the output stream
}
if (fileContent != null) {
fileContent.close();
// Closing the input stream
}
}
}
}
10억 개의 라이브러리 없이 파일과 입력 제어에 대해 생각할 수 있는 가장 간단한 방법:
<%
if (request.getContentType() == null)
return;
// For input type=text controls
String v_Text =
(new BufferedReader(new InputStreamReader(request.getPart("Text1").getInputStream()))).readLine();
// For input type=file controls
InputStream inStr = request.getPart("File1").getInputStream();
char charArray[] = new char[inStr.available()];
new InputStreamReader(inStr).read(charArray);
String contents = new String(charArray);
%>
용도:
DiskFileUpload upload = new DiskFileUpload();
이 오브젝트에서 파일 항목과 필드를 가져와 다음과 같이 서버에 저장할 수 있습니다.
String loc = "./webapps/prjct name/server folder/" + contentid + extension;
File uploadFile = new File(loc);
item.write(uploadFile);
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 privilege */
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();
}
}
}
}
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 파일
위의 서블릿 Upload Servlet을 컴파일하여 다음과 같이 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>
으로 여러 을 보내는 는 '파일'을해야 합니다.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>
언급URL : https://stackoverflow.com/questions/2422468/how-can-i-upload-files-to-a-server-using-jsp-servlet
'IT이야기' 카테고리의 다른 글
NULL은 항상 false입니까? (0) | 2022.06.09 |
---|---|
최적화가 이 기능을 중지시키는 이유는 무엇입니까? (0) | 2022.06.08 |
추가 래핑 태그 없이 v-html을 렌더링하시겠습니까? (0) | 2022.06.08 |
함수 이름 앞에 아스타리스크가 있는 기능은 무엇입니까? (0) | 2022.06.08 |
스탠드아론 VUE 애플리케이션 (0) | 2022.06.08 |