java의 Struts2 파일 업로드 문제 상세 정보

우선 홈페이지 부분, upload_file.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>Upload File</title>
</head>
<body>
  <form action="UploadFile" method="post" enctype="multipart/form-data">
    <!-- -->
    <input type="file" name="source" /> <input type="submit" value=" ">
  </form>
</body>
</html>

파일을 업로드하는 폼은 메타는post로 설정해야 하고,enctype는multipart/form-data로 설정해야 합니다.
위 코드에서 이 폼이 UploadFile에 제출되었음을 볼 수 있습니다. 이 액션을 처리하려면 struts에 있습니다.xml에는 다음과 같이 구성됩니다.

<action name="UploadFile" class="com.lidi.action.UploadAction">
  <result name="success">/uploadResult.jsp</result>
  <!--fileUpload ,  -->
  <interceptor-ref name="fileUpload">
  <!--  20M,  -->
    <param name="maximumSize">20971520</param>
  </interceptor-ref>
  <!-- , fileUpload  -->
  <interceptor-ref name="defaultStack" />
 </action>

업로드 경로를 설정하고 파일 형식과 크기를 제한하는 fileUpload 차단기입니다.
파일 크기를 제한하려면 만으로는 안 되며, 탭에 추가해야 합니다

<constant name="struts.multipart.maxSize" value="21000000"/>
이 코드는 전체 프로젝트에서 파일을 업로드할 수 있는 모든 곳에서 업로드할 수 있는 파일 크기의 최대치를 나타낸다. 즉, 이 프로젝트에 업로드된 모든 단일 파일 크기는 21000000바이트(약 20M)를 초과할 수 없다. 프로젝트에 이 코드를 추가하지 않으면 기본적으로 업로드할 수 있는 파일 크기는 최대 2M이기 때문에struts2가 2M 파일만 업로드할 수 있다는 제한을 돌파하는 방법이다.
파일 형식을 제한합니다. 그림 파일로 제한해야 한다면 에서 설정할 수 있습니다

<!--   -->
<intercepter-ref name="fileUpload">
  <param name="allowedTypes">image/bmp, image/x-png, image/gif, image/jpeg</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />

탭의 값은 모두 파일의 MIME 형식입니다. 자주 사용하는 파일의 MIME 형식은%TOMCAT_HOME%\conf\web.xml에서 찾습니다.
워드 파일로 제한하려면 에서 설정할 수 있습니다

<!--  word  -->
<intercepter-ref name="fileUpload">
  <param name="allowedTypes">application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />

그러나 나는 이렇게 해서 파일 형식을 제한하는 것이 자바스크립트로 전방에서 제한하는 것보다 낫다고 생각한다.
다음은 UploadAction입니다. UploadAction에 필요한 개인 속성은source입니다. 이것은 upload_file.jsp 안의 파일 필드의name 속성은 일치합니다. 즉, 파일 필드의name 속성 값이source라면 UploadAction에는 반드시 개인 속성 source가 있어야 합니다. 또한 두 가지 중요한 개인 속성이 있습니다.
private String sourceFileName;//업로드할 파일의 파일 이름
private String sourceContentType;//업로드할 파일의 파일 형식
이 두 변수 이름의 형식은 바로 앞의 접두사source와 upload_file.jsp의 파일 필드의name 속성은 같습니다.
종합적으로 말하면 upload_file.jsp에서 파일 필드의name = "abc", 액션에서 이렇게 정의해야 합니다

private File abc;
private String abcFileName;
private String abcContentType; 
abc는 업로드할 파일 대상을 자동으로 가져옵니다. abcFileName은 파일 이름을 자동으로 가져옵니다. abcContentType은 파일 형식을 자동으로 가져옵니다.
업로드 경로에 관해서는 내가 중점적으로 말하고자 하는 것이다.
절대 경로에 업로드하는 것은 괜찮지만, 프로젝트 루트 디렉터리에 업로드할 upload 폴더를 업로드하려면 어떻게 이 upload 폴더의 전체 경로를 얻을 수 있습니까?
사용해 봤어요.
ServletActionContext.getServletContext().getRealPath("/upload");
null로 돌아왔습니다.써봤어요.
ServletActionContext.getRequest().getRealPath("/upload");
아니면 null로 돌아왔어요?그러나 인터넷에서 이 문제를 찾았을 때 많은 사람들이 이렇게 쓰는 것을 추천했다. 어떤 상황에서 이렇게 쓰는 것이 확실히 가능하다는 것을 증명하지만 나처럼 null로 돌아가는 사람도 있다. 그들은 동시에 새로운 방법을 추천했다. 바로 Upload Action이 Servlet Context Aware 인터페이스를 실현하도록 하는 것이다.구체적인 방법은 다음과 같다.

public class UploadAction extends ActionSupport implements ServletContextAware {

  /**
   *  ...
   */
  private ServletContext context; 

  public ServletContext getContext() {
    return context;
  }

  public void setContext(ServletContext context) {
    this.context = context;
  }
  
  @Override
  public void setServletContext(ServletContext context) {
    this.context = context;
  }
}

그리고 사용

String path = context.getRealPath("/upload");//  : 
upload 폴더의 경로를 가져옵니다.그런 다음 업로드를 수행합니다.

/* upload */
File savefile = new File(path, sourceFileName);
FileUtils.copyFile(source, savefile);
저는 개인적으로 이런 방법을 추천합니다. 왜냐하면 이런 방법은 프로젝트가 포장되어 다른 환경으로 옮겨질 때도 정확한 경로를 확보할 수 있기 때문입니다.
뒤에 UploadAction의 전체 코드를 붙여넣습니다.java

package com.lidi.action;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport implements ServletContextAware {
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private File source;//  
  private String sourceFileName;//  
  private String sourceContentType; //  
  private ServletContext context; //  
  /*   */
  public ServletContext getContext() {
    return context;
  }
  public void setContext(ServletContext context) {
    this.context = context;
  }
  /* getters & setters */
  public File getSource() {
    return source;
  }
  public void setSource(File source) {
    this.source = source;
  }
  public String getSourceFileName() {
    return sourceFileName;
  }
  public void setSourceFileName(String sourceFileName) {
    this.sourceFileName = sourceFileName;
  }
  public String getSourceContentType() {
    return sourceContentType;
  }
  public void setSourceContentType(String sourceContentType) {
    this.sourceContentType = sourceContentType;
  } 
  @Override
  public void setServletContext(ServletContext context) {
    this.context = context;
  }
  public String execute() throws IOException {
    /* : upload */
    String path;
    path = context.getRealPath("/upload");//  : 
    System.out.println(path);    
    /* upload */
    File savefile = new File(path, sourceFileName);
    FileUtils.copyFile(source, savefile);
    System.out.println(savefile.getAbsolutePath());
    return SUCCESS;
  }
}

업로드 결과 페이지 uploadResult.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML>
<html>
 <head>  
  <title>Upload Result</title>
 </head>
 <body>
 <p> :<s:property value="sourceFileName" /></p>
 <p> :<s:property value="sourceContentType" /></p>
 <p> :<a href="upload/<s:property value="sourceFileName" />"><s:property value="sourceFileName" /></a></p>
 </body>
</html>
위에서 말한 것이 바로 본문의 전체 내용입니다. 여러분이 좋아하시기 바랍니다.

좋은 웹페이지 즐겨찾기