Struts-2-struts-file-uploads
Struts 2-ファイルのアップロード
Struts 2フレームワークは、「HTMLでのフォームベースのファイルアップロード」を使用してファイルアップロードを処理するための組み込みサポートを提供します。 ファイルがアップロードされると、通常は一時ディレクトリに保存され、データが失われないようにするために、Actionクラスによって処理または移動される必要があります。
注-サーバーには、一時ディレクトリおよびWebアプリケーションに属するディレクトリ以外のディレクトリへの書き込みを禁止するセキュリティポリシーが設定されている場合があります。
Strutsでのファイルのアップロードは、org.apache.struts2.interceptor.FileUploadInterceptorクラスを通じて利用可能で、* defaultStack の一部として含まれている *FileUpload インターセプターと呼ばれる事前定義されたインターセプターによって可能です。 以下に示すように、struts.xmlでそれを使用してさまざまなパラメーターを設定できます。
ビューファイルを作成する
選択したファイルを参照してアップロードするために必要なビューの作成から始めましょう。 だから、ユーザーがファイルをアップロードできるプレーンHTMLアップロードフォームで index.jsp を作成しましょう-
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action = "upload" method = "post" enctype = "multipart/form-data">
<label for = "myFile">Upload your file</label>
<input type = "file" name = "myFile"/>
<input type = "submit" value = "Upload"/>
</form>
</body>
</html>
上記の例には、注目に値する点がいくつかあります。 最初に、フォームのenctypeが multipart/form-data に設定されます。 これは、ファイルのアップロードがファイルアップロードインターセプターによって正常に処理されるように設定する必要があります。 次の点は、フォームのアクションメソッド upload とファイルアップロードフィールドの名前( myFile )です。 アクションメソッドとStruts構成を作成するには、この情報が必要です。
次に、単純なjspファイル success.jsp を作成して、ファイルアップロードが成功した場合の結果を表示します。
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>File Upload Success</title>
</head>
<body>
You have successfully uploaded <s:property value = "myFileFileName"/>
</body>
</html>
以下は、ファイルのアップロード中にエラーが発生した場合の結果ファイル error.jsp です-
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>File Upload Error</title>
</head>
<body>
There has been an error in uploading the file.
</body>
</html>
アクションクラスの作成
次に、 uploadFile.java というJavaクラスを作成します。このクラスは、ファイルのアップロードと、そのファイルの安全な場所への保存を処理します-
package com.finddevguides.struts2;
import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException;
import com.opensymphony.xwork2.ActionSupport;
public class uploadFile extends ActionSupport {
private File myFile;
private String myFileContentType;
private String myFileFileName;
private String destPath;
public String execute() {
/*Copy file to a safe location*/
destPath = "C:/apache-tomcat-6.0.33/work/";
try {
System.out.println("Src File name: " + myFile);
System.out.println("Dst File name: " + myFileFileName);
File destFile = new File(destPath, myFileFileName);
FileUtils.copyFile(myFile, destFile);
} catch(IOException e) {
e.printStackTrace();
return ERROR;
}
return SUCCESS;
}
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
}
*uploadFile.java* は非常に単純なクラスです。 注意すべき重要なことは、FileUploadインターセプターとParametersインターセプターがすべての面倒な作業を行うということです。
FileUploadインターセプターは、デフォルトで3つのパラメーターを使用可能にします。 彼らは次のパターンで命名されています-
- [ファイル名パラメータ] -これは、ユーザーがアップロードした実際のファイルです。 この例では、「myFile」になります
- [ファイル名パラメータ] ContentType -これは、アップロードされたファイルのコンテンツタイプです。 この例では、「myFileContentType」になります
- [ファイル名パラメータ] FileName -これはアップロードされたファイルの名前です。 この例では、「myFileFileName」になります
Struts Interceptorsのおかげで、3つのパラメーターを使用できます。 行う必要があるのは、Actionクラスに正しい名前で3つのパラメーターを作成することです。これらの変数は自動的に自動接続されます。 そのため、上記の例では、3つのパラメーターと、すべてが正常に終了した場合に「成功」を返すアクションメソッドがあり、それ以外の場合は「エラー」を返します。
構成ファイル
以下は、ファイルのアップロードプロセスを制御するStruts2構成プロパティです-
Sr.No | Properties & Description |
---|---|
1 |
struts.multipart.maxSize ファイルのアップロードとして受け入れられるファイルの最大サイズ(バイト単位)。 デフォルトは250Mです。 |
2 |
struts.multipart.parser マルチパートフォームのアップロードに使用されるライブラリ。 デフォルトでは jakarta |
3 |
struts.multipart.saveDir 一時ファイルを保存する場所。 デフォルトではjavax.servlet.context.tempdirです。 |
これらの設定を変更するには、アップロードするファイルの最大サイズを変更するのと同じように、アプリケーションのstruts.xmlファイルで constant タグを使用できます。
次のように struts.xml を用意しましょう-
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true"/>
<constant name = "struts.multipart.maxSize" value = "1000000"/>
<package name = "helloworld" extends = "struts-default">
<action name = "upload" class = "com.finddevguides.struts2.uploadFile">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
*FileUpload* インターセプターはインターセプターのデフォルトスタックの一部であるため、明示的に構成する必要はありません。 ただし、<interceptor-ref>タグを<action>内に追加できます。 fileUploadインターセプターは、2つのパラメーター*(a)maximumSize *および*(b)allowedTypes *を取ります。
maximumSizeパラメーターは、許可される最大ファイルサイズを設定します(デフォルトは約2MBです)。 allowedTypesパラメータは、以下に示すように、受け入れられたコンテンツ(MIME)タイプのコンマ区切りリストです-
<action name = "upload" class = "com.finddevguides.struts2.uploadFile">
<interceptor-ref name = "basicStack">
<interceptor-ref name = "fileUpload">
<param name = "allowedTypes">image/jpeg,image/gif</param>
</interceptor-ref>
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
以下は web.xml ファイルの内容です-
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
次に、プロジェクト名を右クリックし、[エクスポート]> [WARファイル] をクリックして、WARファイルを作成します。 次に、このWARをTomcatのwebappsディレクトリにデプロイします。 最後に、Tomcatサーバーを起動して、URL *http://localhost:8080/HelloWorldStruts2/upload.jsp にアクセスしてみます。 これにより、次の画面が生成されます-
[参照]ボタンを使用してファイル「Contacts.txt」を選択し、アップロードボタンをクリックしてファイルをサーブにアップロードすると、次のページが表示されます。 アップロードされたファイルがC:\ apache-tomcat-6.0.33 \ workに保存されていることを確認できます。
FileUpload Interceptorはアップロードされたファイルを自動的に削除するため、削除される前に、アップロードされたファイルをプログラムで特定の場所に保存する必要があります。
エラーメッセージ
fileUplaodインターセプターはいくつかのデフォルトのエラーメッセージキーを使用します-
Sr.No | Error Message Key & Description |
---|---|
1 |
struts.messages.error.uploading ファイルをアップロードできなかったときに発生する一般的なエラー。 |
2 |
struts.messages.error.file.too.large アップロードされたファイルがmaximumSizeで指定された大きすぎる場合に発生します。 |
3 |
struts.messages.error.content.type.not.allowed アップロードされたファイルが、指定された予想されるコンテンツタイプと一致しない場合に発生します。 |
*WebContent/WEB-INF/classes/messages.properties* リソースファイルでこれらのメッセージのテキストをオーバーライドできます。