JavaWeb의 struts2 파일 업로드 다운로드 기능 실례 분석

B/S시스템을 만들 때 보통 파일을 업로드하고 다운로드하는 것과 관련된다. struts2 프레임워크를 연결하기 전에 우리는 아파치 아래의commons 하위 프로젝트의 File Upload 구성 요소를 사용하여 파일을 업로드한다. 그러나 그렇게 하면 코드가 번거롭고 유연하지 않아 보인다. struts2를 배운 후struts2는 파일 업로드 다운로드에 더욱 좋은 실현 메커니즘을 제공한다.여기서 저는 각각 단일 파일 업로드와 다중 파일 업로드의 원본 코드에 대해 설명을 하겠습니다. 여기는 파일을 가져와서 업로드하는jar파일 두 개를 다운로드해야 합니다. 하나는commons-fileupload-1.2.2입니다.jar, 다른 하나는commons-io-2.0.1.jar
struts2 단일 파일 업로드:
우선 jsp 파일 업로드 페이지입니다. 이것은 비교적 간단합니다. 바로 하나의 표입니다. 안에 파일 업로드 상자가 있습니다.

 <!-- , post , , enctype , multipart/form-data,
   --> 
  <form action="fileUpload.action" method="post" enctype="multipart/form-data">
   
  username: <input type="text" name="username"><br>
  file: <input type="file" name="file"><br>
  
  <input type="submit" value="submit">
 </form>
다음은 File Upload Action 부분 코드입니다. struts2는 업로드와 다운로드에 좋은 실습 메커니즘을 제공하기 때문에 action 부분에서 우리는 아주 적은 코드만 쓰면 됩니다.

public class FileUploadAction extends ActionSupport
{
 private String username;
 
   // ,file jsp , 
 private File file;
 
 // file 
 private String fileFileName;
 
 // file MIME 
 private String fileContentType;

 public String getUsername()
 {
  return username;
 }

 public void setUsername(String username)
 {
  this.username = username;
 }

 public File getFile()
 {
  return file;
 }

 public void setFile(File file)
 {
  this.file = file;
 }

 public String getFileFileName()
 {
  return fileFileName;
 }

 public void setFileFileName(String fileFileName)
 {
  this.fileFileName = fileFileName;
 }

 public String getFileContentType()
 {
  return fileContentType;
 }

 public void setFileContentType(String fileContentType)
 {
  this.fileContentType = fileContentType;
 }
 
 @Override
 public String execute() throws Exception
 {
  String root = ServletActionContext.getServletContext().getRealPath("/upload");
  
  InputStream is = new FileInputStream(file);
  
  OutputStream os = new FileOutputStream(new File(root, fileFileName));
  
  System.out.println("fileFileName: " + fileFileName);

    //  file , , fileFileName 
  System.out.println("file: " + file.getName());
  System.out.println("file: " + file.getPath());
  
  byte[] buffer = new byte[500];
  int length = 0;
  
  while(-1 != (length = is.read(buffer, 0, buffer.length)))
  {
   os.write(buffer);
  }
  
  os.close();
  is.close();
  
  return SUCCESS;
 }
}
우선 여기 있는 파일은 jsp가 업로드한 파일을 가리키는 것이 아닙니다. 파일이 업로드될 때struts2는 우선struts를 찾습니다.multipart.saveDir (이것은 default.properties에 있습니다) 이name가 지정한 저장 위치입니다. struts를 새로 만들 수 있습니다.properties 속성 파일은 이 임시 파일의 저장 위치를 지정합니다. 지정되지 않으면, 파일은tomcat의apache-tomcat-7.0.29\work\Catalina\localhost\디렉터리에 저장됩니다. 그리고 파일이 업로드된 저장 위치를 지정할 수 있습니다. 출력 흐름을 통해 흐름에 쓰면 됩니다. 이때 우리는 폴더에서 우리가 업로드한 파일을 볼 수 있습니다.
파일을 업로드한 후에 우리는 그것을 다운로드해야 한다. 사실struts2의 파일 다운로드 원리는 매우 간단하다. 바로 입력 흐름을 정의한 다음에 파일을 입력 흐름에 쓰면 된다. 관건적인 설정은 역시struts이다.xml 이 프로필에 설정:
FileDownloadAction 코드는 다음과 같습니다.

public class FileDownloadAction extends ActionSupport
{
 public InputStream getDownloadFile()
 {
  return ServletActionContext.getServletContext().getResourceAsStream("upload/ 2012 9 4 .xls");
 }
 
 @Override
 public String execute() throws Exception
 {
  return SUCCESS;
 }
}
우리가 보기에, 이 액션은 입력 흐름을 정의한 다음에 getter 방법을 제공하면 된다. 다음은 struts를 보자.xml 프로필:

  <action name="fileDownload" class="com.xiaoluo.struts2.FileDownloadAction">
   <result name="success" type="stream">
    <param name="contentDisposition">attachment;filename=" 2012 9 4 .xls"</param>
    <param name="inputName">downloadFile</param>
   </result>
  </action>
struts.xml 프로필은 몇 가지 주의해야 할 점이 있습니다. 우선result의 형식입니다. 이전에 우리는 action을 정의했습니다. result에서 우리는 기본적으로 type 속성을 쓰지 않았습니다. 기본적으로 전송 요청 (dispatcher) 방식이기 때문에 이 속성을 제외하고redirect (리디렉션) 등 이 값을 사용했습니다. 여기서 우리는 파일 다운로드를 사용하기 때문에 type는stream 형식으로 정의해야 합니다.이것은 파일이 다운로드된result라고 알려줍니다. result 요소 안에 파라미터 요소가 있습니다. 이것은 파일이 다운로드될 때의 매개 변수를 설정하는 것입니다. inputName이라는 속성은 action의 파일 입력 흐름을 얻는 것입니다. 이름은 반드시 action의 입력 흐름 속성 이름과 같아야 합니다. 그 다음은 contentDisposition 속성입니다. 이 속성은 우리가 다운로드한 파일을 어떤 방식으로 처리하기를 원하는지 지정하는 데 사용됩니다.만약 값이attachment라면 다운로드 상자를 팝업해서 사용자가 다운로드 여부를 선택하도록 합니다. 이 값을 설정하지 않으면 브라우저는 먼저 다운로드한 파일을 열 수 있는지 확인하고, 할 수 있다면 다운로드한 파일을 직접 열 것입니다. (이것은 당연히 우리가 필요로 하는 것이 아닙니다.) 다른 값은 filename입니다. 이것은 파일이 다운로드할 때 제시한 파일 다운로드 이름입니다.이 정보를 설정한 후에 우리는 파일의 다운로드 기능을 실현할 수 있다.
struts2 다중 파일 업로드:
사실 다중 파일 업로드는 단일 파일 업로드 원리와 같다. 단일 파일이 업로드된 것은 단일한 File이고 다중 파일이 업로드된 것은 List 집합 또는 하나의 File [] 수조이다. 우선 전방 jsp 부분의 코드를 살펴보자. 여기서 나는 jquery를 사용하여 동적 추가 파일 다운로드 상자와 동적 삭제 다운로드 상자를 실현했다.

 <script type="text/javascript" src="script/jquery-1.8.1.js"></script>
 <script type="text/javascript">
   
  $(function()
  {
   $("#button").click(function()
   {
    var html = $("<input type='file' name='file'>");
    var button = $("<input type='button' name='button' value=' '><br>");
    
    $("#body div").append(html).append(button);
    
    button.click(function()
    {
     html.remove();
     button.remove();
    })
   })
  })
 
 </script>
 </head>
 
 <body id="body">

 <form action="fileUpload2.action" method="post" enctype="multipart/form-data">
 
  username: <input type="text" name="username"><br>
  file: <input type="file" name="file">
  <input type="button" value=" " id="button"><br>
  <div></div>
  <input type="submit" value="submit"> 
  
 </form>

 </body>
파일의 이름은 모두 파일로 명명되어야 하며, 여러 파일이 업로드하는 action 코드를 다음과 같이 처리해야 합니다.

public class FileUploadAction2 extends ActionSupport
{
 private String username;
 
  // List ,file , 
 private List<File> file;
 
  // List , List<File> 
 private List<String> fileFileName;
 
 private List<String> fileContentType;

 public String getUsername()
 {
  return username;
 }

 public void setUsername(String username)
 {
  this.username = username;
 }

 public List<File> getFile()
 {
  return file;
 }

 public void setFile(List<File> file)
 {
  this.file = file;
 }

 public List<String> getFileFileName()
 {
  return fileFileName;
 }

 public void setFileFileName(List<String> fileFileName)
 {
  this.fileFileName = fileFileName;
 }

 public List<String> getFileContentType()
 {
  return fileContentType;
 }

 public void setFileContentType(List<String> fileContentType)
 {
  this.fileContentType = fileContentType;
 }
 
 @Override
 public String execute() throws Exception
 {
  String root = ServletActionContext.getServletContext().getRealPath("/upload");
  
  for(int i = 0; i < file.size(); i++)
  {
   InputStream is = new FileInputStream(file.get(i));
   
   OutputStream os = new FileOutputStream(new File(root, fileFileName.get(i)));
   
   byte[] buffer = new byte[500];
   
   @SuppressWarnings("unused")
   int length = 0;
   
   while(-1 != (length = is.read(buffer, 0, buffer.length)))
   {
    os.write(buffer);
   }
   
   os.close();
   is.close();
  }
  
  return SUCCESS;
 }
}
이렇게 하면 출력 흐름에 똑같이 쓰고, 이렇게 하면 우리는 폴더에 업로드된 여러 개의 파일을 볼 수 있다
다음 파일 다운로드는 아까 파일 다운로드와 똑같습니다,struts.xml도 마찬가지입니다. 여기는 더 이상 중복되지 않습니다.
요약: 전체적으로 말하자면 struts2가 제공하는 파일 업로드 다운로드 메커니즘은 우리의 많은 코드를 간소화시켰다. 우리는 앞으로의 프로젝트에서 이 메커니즘을 사용할 수 있다. 마찬가지로 우리는 File Upload 구성 요소를 사용하여 파일을 업로드할 수 있다. 이것은 모두 개인의 취향에 의해 결정된다!
JavaWeb의 파일 업로드와 다운로드 기능에 대한 내용이 이렇게 많습니다. 읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기