この記事の例では、java の struts2 にファイルのアップロードおよびダウンロード機能を実装する方法を説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
1.ファイルアップロード
1つ目はJSPページのコードです。
JSPページでアップロードタグを定義する
次のようにコード code をコピーします:<tr>
<td align="right" bgcolor="#F5F8F9"><b>添付ファイル:</b></td>
<td bgcolor="#FFFFFF">
<input type="file" name="アップロード" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
この場合、BaseAction で定義された関連属性は省略されます (アクセス修飾子を変更するだけで、独自のアクションで定義することもできます)。
次のようにコード code をコピーします:/**
*アクション基本クラス
**/
public class BaseAction extends ActionSupport {
protected List<File> アップロード;
protected List<String> //ファイル タイプ;
protected List<String> //ファイル名;
protected String savePath // パスを保存します。
}
次に、Action にアップロード メソッドがあり、コードは次のとおりです。
次のようにコード code をコピーします:/**
* 8. 添付ファイルのアップロード * @param Upload
*/
public void UploadAccess(List<ファイル> アップロード){
試す {
if (null != アップロード) {
for (int i = 0; i < Upload.size(); i++) {
文字列パス = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(パス);
item.set Accessories(getUploadFileName().get(i));
FileOutputStream fos = 新しい FileOutputStream(パス);
FileInputStream fis = new FileInputStream(getUpload().get(i));
byte[] バッファ = 新しいバイト [1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(バッファ, 0, len);
}
fis.close();
fos.close();
}
}
} catch (例外 e) {
logger.error("添付ファイルのアップロード中にエラーが発生しました。", e);
}
}
次に、struts2.xml ファイルのコピーコードは次のとおりです: <action name="itemRDAction_*" method="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
application/octet-stream、image/pjpeg、image/bmp、image/jpg、image/png、image/gif、image/jpeg、application/msword、application/vnd.openxmlformats-officedocument.wordprocessingml.document、application/vnd。 msエクセル
</param>
<param name="fileUpload.maximumSize">8000000</param>
</interceptor-ref>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</アクション>
savePath は保存パスです。fileUpload.allowedTypes はアップロード ファイルの種類を制限するために使用されます。 fileUpload.maximumSize ファイル サイズの制限を制限します。
2.ファイルダウンロード
まず、次のようにページ上のダウンロード リンク コードをコピーします: <tr>
<td align="right" bgcolor="#F5F8F9"><b>添付ファイル:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory}</div>
<c:if test="${!空のアイテム.アクセサリ}">
<div style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.accessory}">ダウンロード</a>< /div>
</c:if>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
次は DownloadAction のコードです。
次のようにコード code をコピーします:/**
* ダウンロードアクション
*
* @作者zhaoxz
*
*/
@Controller("ダウンロードアクション")
@Scope("プロトタイプ")
public class DownloadAction extends BaseAction {
/**
*
*/
プライベート静的最終ロングシリアルバージョンUID = -4278687717124480968L;
private static Logger ロガー = Logger.getLogger(DownloadAction.class);
プライベート文字列ファイル名。
プライベートInputStream入力ストリーム;
プライベート文字列の保存パス。
プライベート文字列 mimeType;
public InputStream getInputStream() {
試す {
文字列パス = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(パス);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = 新しい FileInputStream(パス);
文字列エージェント = request.getHeader("USER-AGENT");
System.out.println(エージェント);
if (null != エージェント) {
if (-1 != Agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} else {// IE7 以降の Chrome
System.out.println("IE,Chrome");
filename = new String(filename.getBytes("ISO8859-1"),"utf-8");
ファイル名 = java.net.URLEncoder.encode(ファイル名, "UTF-8");
}
}
} catch (例外 e) {
logger.error("ファイル情報のダウンロード中にエラーが発生しました。", e);
}
if (null == inputStream) {
System.out.println("getResource エラー");
}
入力ストリームを返します。
}
public void setInputStream(InputStream inputStream) {
this.inputStream = 入力ストリーム;
}
@オーバーライド
public Stringexecute() が例外をスローする {
成功を返します。
}
/****************************** 準備を整えます ***************** ******* **********/
public String getSavePath() {
this.savePath を返します。
}
public void setSavePath(String savePath) {
this.savePath = 保存パス;
}
public String getFilename() {
ファイル名を返します。
}
public void setFilename(String filename) {
this.filename = ファイル名;
}
}
次に、その struts2.xml ファイルがあります。
次のようにコードをコピーします: <action name="download">
<param name="savePath">E:/upload</param>
<result type="ストリーム">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">添付ファイル;ファイル名="${filename}"</param>
<param name="inputName">inputStream</param>
</結果>
</アクション>
ダウンロードする際はエンコード形式に注意すれば問題ありません。
アップロード中に問題が発生しました
1. 大きなファイルをアップロードするとエラーが発生します。
発生するエラーは次のとおりです。
1. 2012-02-24 11:06:31,937 エラー (org.apache.struts2.dispatcher.Dispatcher:512) - アクションまたは結果が見つかりませんでした
アクション com.iman.portal.action.QuestionActionImpl と結果の結果が定義されていません。problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. サイズ (2973652) が構成された最大値 (2097152) を超えているため、要求は拒否されました。
中国語の意味: サイズ (2973652) が構成された最大値 (2097152) を超えているため、要求は拒否されました。
ユーザーエクスペリエンスを考慮して、添付ファイルをアップロードするときにこのような例外をインターセプトする必要があります。解決策は次のとおりです。
1. アップロードされたファイルは、アップロード プロセス中に最初にキャッシュに保存されます。ただし、サーバーの物理パスはプロジェクトに設定されていますが、安全上の理由から、プロジェクトの struts.properties ファイルに一時的なストレージ パスを追加します。
次のようにコードをコピーします: struts.multipart.saveDir=/temp
2. アップロードするファイルのサイズがデフォルトであるかどうかに関係なく、後で変更される可能性があることを考慮して、プロジェクトの struts.properties ファイルに次の構成を追加します。
次のようにコードをコピーします: <!-- 許可されるアップロード ファイル サイズは 2M です -->
<constant name="struts.multipart.maxSize" value="2097152"/>
3. struts.xmlの設定
次のようにコードをコピーします: <!-- 問題を修正する方法 -->
<アクション名="更新問題" メソッド="更新問題">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</アクション>
4. 最も重要かつ重要なステップ
fileUpload インターセプターは、ファイルがサーバーにアップロードされた後にのみ、ファイルの種類とサイズを決定します。 Action で何もしないとユーザーの目の前に例外が表示されてしまうため、例外情報を Action レベルのエラー メッセージとして設定する方法を考えました。つまり、addActionError メソッドをオーバーライドします。
次のようにコードをコピーします: @Override
public void addActionError(String anErrorMessage) {
// ここでは、処理する前に、置き換えたいエラーかどうかをまず判断する必要があります。
if (anErrorMessage.startsWith("サイズが大きいためリクエストは拒否されました")) {
パターン pattern = Pattern.compile("d+");
マッチャー m = pattern.matcher(anErrorMessage);
// 1 回一致
m.find();
String s1 =m.group();//アップロードされたファイルのサイズ
// 再度マッチング
m.find();
String s2 =m.group();//サイズ制限あり
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="アップロードしたファイルのサイズ (" + Long.valueOf(s1)/1024 + "バイト) が許容サイズ (" + Long.valueOf(s2)/1024/1024 + "M)" を超えています。
getRequest().setAttribute("fileUploadErrorMessage","ファイルが大きすぎるため、許容サイズ ("+Long.valueOf(s2)/1024/1024+"M) を超えています。アップロードに失敗しました!");
// 情報を置き換えます
super.addActionError(fileUploadErrorMessage);
}
} else {// それ以外の場合は、元のメソッドに従って処理します
super.addActionError(anErrorMessage);
}
}
はい、戻りページで <s:fielderror/> <s:fielderror/> を使用して、addActionError のエラー内容を取得します。
エラーの原因をページ上に表示したくなく、プロンプト ボックスをポップアップ表示したいため、情報をリクエスト オブジェクトに入れます。
ページが読み込まれると、次の js 検証が追加されます。
次のようにコードをコピーします: // ファイルが正常にアップロードされたかどうかを確認します。
var message="${request.fileUploadErrorMessage}";
if(メッセージ!=null && ""!=trim(メッセージ) && メッセージ!="null"){
self.parent.diag.close();
アラート(メッセージ);
戻る;
}
Dongdong を理解するための参考文献をいくつか示します。
struts.multipart.maxSize は、プロジェクト全体によってアップロードされるファイルの最大サイズを制御します
struts.multipart.maxSize および fileUpload インターセプターの MaximumSize 属性にはさまざまな役割分担があり、それは次のように要約されます。
1.struts.multipart.maxSize は、プロジェクト全体でアップロードされるファイルの最大サイズを制御します。
このサイズを超えると、バックグラウンドでエラーが報告され、プログラムはそのような大きなファイルを処理できなくなります。 fielderror に次のプロンプトが表示されます。
サイズ (16272982) が構成された最大値 (9000000) を超えているため、要求は拒否されました。
2. fileUpload インターセプターの MaximumSize 属性は、struts.multipart.maxSize の値より小さくなければなりません。
デフォルトの struts.multipart.maxSize は 2M です。maximumSize が 2M より大きい場合、struts.multipart.maxSize の値は minimumSize より大きく設定する必要があります。
3. アップロードされたファイルが struts.multipart.maxSize より大きい場合、システムはエラーを報告します。 アップロードされたファイルが struts.multipart.maxSize と minimumSize の間にある場合、システムは次のプロンプトを表示します。
ファイルが大きすぎます: ファイル "MSF コンセプト.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
アップロードされたファイルがmaximumSizeより小さい場合、アップロードは成功します。
次のようにコードをコピーします: <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</アクション>
解決策 2: 大きなファイルをアップロードするとエラーが発生します。
問題: 大きなファイルをアップロードするとエラーが発生します...
解決策: struts.xml ファイル内のパラメーターを次のように変更します。 <constant name="struts.multipart.maxSize" value="55000000"/>
<アクション名="ファイルのアップロード">
<result name="UploadFileResult">/www.VeVB.COm/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</アクション>
struts.xml ファイル内のサイズと実際のファイル サイズの関係: 1048576 (バイト) = 1024*1024 = 1M 実際のファイル サイズ。
struts.multipart.maxSize は、プロジェクト全体によってアップロードされるファイルの最大サイズを制御します
struts.multipart.maxSize および fileUpload インターセプターの MaximumSize 属性にはさまざまな役割分担があり、それは次のように要約されます。
1.struts.multipart.maxSize は、プロジェクト全体でアップロードされるファイルの最大サイズを制御します。このサイズを超えると、バックグラウンドでエラーが報告され、プログラムはそのような大きなファイルを処理できなくなります。 fielderror に次のプロンプトが表示されます。
サイズ (16272982) が構成された最大値 (9000000) を超えているため、要求は拒否されました。
2. fileUpload インターセプターの MaximumSize 属性は、struts.multipart.maxSize の値より小さくなければなりません。
デフォルトの struts.multipart.maxSize は 2M です。maximumSize が 2M より大きい場合、struts.multipart.maxSize の値は minimumSize より大きく設定する必要があります。
3. アップロードされたファイルが struts.multipart.maxSize より大きい場合、システムはエラーを報告します。 アップロードされたファイルが struts.multipart.maxSize と minimumSize の間にある場合、システムは次のプロンプトを表示します。
ファイルが大きすぎます: ファイル "MSF コンセプト.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
アップロードされたファイルがmaximumSizeより小さい場合、アップロードは成功します。
アップロードするファイルの種類の制限
ファイルアップロードインターセプターを構成する
struts2 のdefaultStack にはすでに fileupload インターセプターが含まれています。 allowedTypes パラメーターを追加する場合は、新しいデフォルトスタックを作成し、コピーして変更する必要があります。
次のようにコードをコピーします: <インターセプター>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="例外"/>
<interceptor-ref name="エイリアス"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name=www.VeVB.COm/>
<interceptor-ref name="chain"/>
<interceptor-ref name="デバッグ"/>
<interceptor-ref name="プロファイリング"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
画像/png、画像/gif、画像/jpeg
</param>
</interceptor-ref>
<interceptor-ref name="チェックボックス"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo..*,^struts..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="検証">
<param name="excludeMethods">入力、戻る、キャンセル、参照</param>
</interceptor-ref>
<interceptor-ref name="ワークフロー">
<param name="excludeMethods">入力、戻る、キャンセル、参照</param>
</interceptor-ref>
</インターセプタースタック>
</インターセプター>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
コード内のコピーされたコードのみを次のように変更します: <interceptor-ref name="fileUpload">
<param name="allowedTypes">
画像/png、画像/gif、画像/jpeg
</param>
</interceptor-ref>
インターセプター スタックは、上記のように <package> タグの内側と <action> タグの外側で構成されます。デフォルトのインターセプターとして定義する場合は、その必要はありません。
それを <action> タグに導入します。そうでない場合は、コードをコピーする必要があります。 <action>
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</アクション>
ファイル アップロード タイプのエラー アクションは入力を直接返すため、アクションで「input」を返す必要はありません。
<package> タグの外側でアップロード リクエストのパスとサイズを定義することもできます。
次のようにコードをコピーします: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
最も重要な点: ファイルをアップロードするフォームに enctype="multipart/form-data" を追加する必要があります。追加しないと、入力エラーが報告されます。
この記事が皆さんの Java プログラミングに役立つことを願っています。