必要なライブラリ

  1. jakarta-Struts-1.3.8
  2. jakarta-commons-fileUpload
  3. jakacat-commons-io

Form

package com.snail.example;

import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;

public class UploadForm extends ActionForm {

  private static final long serialVersionUID = 8531510541714915232L;

  private FormFile upFile;

  private String comment;

  public void setComment(String comment) {
    this.comment = comment;
  }

  public String getComment() {
    return comment;
  }

  public void setUpFile(FormFile upFile) {
    this.upFile = upFile;
  }

  public FormFile getUpFile() {
    return upFile;
  }
}

複数ファイルをアップロードしたいときには、FormFile?[] にする。

Action

package com.snail.example;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

public class UploadAction extends Action {
  public ActionForward execute(ActionMapping map,ActionForm form,HttpServletRequest req,HttpServletResponse res){
    UploadForm fm = (UploadForm)form;
    
    String comment = fm.getComment();
    FormFile file = (FormFile)fm.getUpFile();
    String contentType = file.getContentType();
    String fileName = file.getFileName();
    int size = file.getFileSize();    
        
    req.setAttribute("FileName",fileName);
    req.setAttribute("FileSize",size);
    req.setAttribute("ContentType", contentType);
    req.setAttribute("Comment", comment);
    
    if("application/zip".equals(contentType)){
      try{
      String deflatedFiles = inflateZip(file.getInputStream());
        req.setAttribute("Deflate",deflatedFiles);
      }catch (Exception e) {
        e.printStackTrace();
        req.setAttribute("Deflate", "failed");
      }finally{
        file.destroy();
      }
    }
    
    return map.findForward("success");
  }
  
  private String inflateZip(InputStream is) throws FileNotFoundException, IOException{
    StringBuilder outFileNames = new StringBuilder();
    
    ZipInputStream zipInp = new ZipInputStream(new BufferedInputStream(is));
    ZipEntry entry = null;
    while ((entry = zipInp.getNextEntry()) != null) {
      if (!entry.isDirectory()) {
        outFileNames.append(entry
            .getName());
        CheckedOutputStream out = new CheckedOutputStream(
            new BufferedOutputStream(new FileOutputStream("C:\\out\\"+entry
                .getName())), new CRC32());
        byte[] buf = new byte[zipInp.available()];
        int writeSize = 0;
        int totalSize = 0;
        while ((writeSize = zipInp.read(buf)) != -1) {
          totalSize += writeSize;
          out.write(buf, 0, writeSize);
        }
        out.close();

        if (entry.getSize() != totalSize) {
          System.out.println("wrong size");
        }
        if (entry.getCrc() != out.getChecksum().getValue()) {
          System.out.println("wrong checksum");
        }
      }
      zipInp.closeEntry();
    }
    zipInp.close();
    return outFileNames.toString();
  }
  
}

Struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC 
  "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
  "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

  <form-beans>
    <form-bean name="uploadForm" type="com.snail.example.UploadForm"/>
  </form-beans>

  <global-exceptions>
  </global-exceptions>

  <global-forwards>
    <forward name="welcome" path="/Welcome.do"/>
  </global-forwards>

  <action-mappings>
    <action path="/Welcome" forward="/pages/Welcome.jsp">
    </action>
    
    <action 
      path="/upload" 
      name="uploadForm" 
      type="com.snail.example.UploadAction" 
      scope="request"
      validate="false" 
      input="/pages/Welcome.jsp">
        <forward 
          name="success" 
          path="/pages/done.jsp"/>
    </action>

  </action-mappings>
  
  <controller bufferSize="4096" maxFileSize="256M" tempDir="C:\temp"/>
  
  <message-resources parameter="java.MessageResources"/>
  
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml"/>
  </plug-in>

</struts-config>

JSP(welcome.jsp アップロード画面)

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html:html>
<head>
<title>Upload Example</title>
<html:base/>
</head>
<body bgcolor="white">

<html:form action="upload.do" enctype="multipart/form-data">

<table>
  <tr>
    <td>file:</td>
    <td><html:file property="upFile"/></td>
  </tr>
  <tr>
    <td>comment:</td>
    <td><html:text property="comment"/></td>
  </tr>
  <tr>
    <td colspan="2" align="right">
      <html:submit>Upload</html:submit>
    </td>
  </tr>
</table>

</html:form>

</body>
</html:html>

enctype を指定することにより、form(ここでは"comment")と添付ファイルを同時に送られるようになる。

zipup.png

JSP(done.jsp アップロード結果画面)

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

<html:html>

<head>
<title>Complete</title>
<html:base/>
</head>

<body bgcolor="white">
Update Done.
<table>
  <tr>
    <td>File Name</td>
    <td><bean:write name="FileName"/></td>
  </tr>
  <tr>
    <td>File Size</td>
    <td><bean:write name="FileSize"/></td>
  </tr>
  <tr>
    <td>Content Type</td>
    <td><bean:write name="ContentType"/></td>
  </tr>
  <tr>
    <td>Comment</td>
    <td><bean:write name="Comment"/></td>
  </tr>
  <tr>
    <td>Zip Contents</td>
    <td><bean:write name="Deflate"/></td>
  </tr>
</table>

</body>
</html:html>
zipup2.png

Java#Struts


添付ファイル: filezipup.png 1989件 [詳細] filezipup2.png 1922件 [詳細] filezipup3.png 2029件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2007-06-09 (土) 21:17:20 (6410d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=56027c8d02
ISBN10
ISBN13
9784061426061