ファイルアップロード
フォーム
ファイルアップロードフォームの要件
- フォームの送信方法はPOSTである必要があります
- フォームにはフォーム要素が必要です:またはstruts2ラベル<s:file label =“ xxx” name =“ xxx” />
- フォームのenctype属性はmultipart / form-dataである必要があります
。フォームのenctype属性の3つの値の表現と意味は次のとおりです
(1)application / x-www-form-urlencoded、デフォルト値、フォームフィールドのみを処理できますvalue属性、このエンコード方式を使用するフォームは、フォームフィールドの値をURLエンコード方式に処理します。
(2)このエンコード方式を使用するmultipart / form-dataは、フォームデータをバイナリストリームで処理します。このエンコード方式は、ファイルドメインで指定されたファイルのコンテンツをリクエストパラメータにカプセル化します。
(3)Text / plain。このエンコード方式は、フォームのaction属性がmailto:URLの場合により便利です。このメソッドは、主にフォームから直接メールを送信するのに適しています。
1.フォームの例、 JSPコードの
レンダリング
:
<font color="red"><s:actionerror/></font>
<form action="${pageContext.request.contextPath}/UserAction_login" "return check(this);" method="post" enctype="multipart/form-data">
<table align="center" border="1">
<tr>
<td bgcolor="#bbbbbb">用户名:</td>
<td><input type="text" name="id"/></td>
</tr>
<tr>
<td bgcolor="#bbbbbb">密 码:</td>
<td><input type="password" name="pwd"/></td>
</tr>
<tr>
<td bgcolor="#bbbbbb">照 片:</td>
<td><input type="file" name="photo"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录"> <input type="reset" value="重置"></td>
</tr>
</table>
</form>
struts2タグを使用する場合は、struts2タグライブラリを導入する必要があります
<%@ taglib prefix="s" uri="/struts-tags"%>
2.アクションコード
package com.action;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.valueBean.User;
public class UserAction extends ActionSupport{
//封装除了文件的其他信息
private String id;
private String pwd;
//封装上传的文件对象
private File photo;
//上传的文件类型 固定格式xxxContentType
private String photoContentType;
//上传的文件名 固定格式xxxFileName
private String photoFileName;
//生成唯一的文件名(该方法在上传的文件名不重复时可以不需要)
private String uniqueFileName(String FileName) {
//通过时间获得唯一的字符串(不修改日期时间情况下唯一)
DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
String formatDate = format.format(new Date());
//获得.最后出现的位置,分割文件名和后缀名
int position = photoFileName.lastIndexOf(".");
String extension = photoFileName.substring(position);
return formatDate + extension;
}
//处理请求的方法
public String login() throws Exception {
//判断登录信息(为了方便理解,这里使用固定的用户名密码判断)
if(id.equals("admin") && pwd.equals("123456")) {
ActionContext.getContext().getSession().put("id","admin");
/*
*获得存放的绝对路径(注意,如果存放在项目的文件夹下服务器重启会消失,
* 若要永久保存,可放至固定目录如:String realPath = "c:/images";)
*/
String realPath = ServletActionContext.getServletContext().getRealPath("/photo");
//自动生成唯一的文件名(若文件名不重复时可使用一下注释的代码并不需要编写 uniqueFileName方法)
String realFileName = uniqueFileName(photoFileName);
File real = new File(realPath,realFileName);
//不重复时代码
/*
File real = new File(realPath,photoFileName);
*/
//判断路径是否存在,不存在的话自动创建
if(photo != null)
if(!real.getParentFile().exists())
real.getParentFile().mkdirs();
//拷贝photo文件内容到real
FileUtils.copyFile(photo, real);
return "loginSuccess";
}
else {
ActionContext.getContext().put("error", "用户名或密码错误!");
return "loginLose";
}
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
}
3.構成ファイルstruts.xml情報
<struts>
<package name="login" namespace="/" extends="struts-default">
<action name="UserAction_*" class="com.action.UserAction" method="{1}">
<result name="loginSuccess">/welcome.jsp</result>
<result name="loginLose" >/login.jsp</result>
<!-- 错误信息返回页面 -->
<result name="input">/{1}.jsp</result>
</action>
</package>
</struts>
4.許可されるファイルの種類(サフィックス名)と最大ファイルサイズを設定する
<struts>
<!-- 设置最大允许上传的文件大小(字节),默认2M
<constant name="struts.multipart.maxSize" value="20480000"></constant>
-->
<package name="login" namespace="/" extends="struts-default">
<action name="UserAction_*" class="com.action.UserAction" method="{1}">
<interceptor-ref name="defaultStack">
<!-- 设置允许上传的文件类型(允许使用通配符) -->
<param name="fileUpload.allowedTypes">image/*</param>
<!-- 设置允许上传的文件后缀名
<param name="fileUpload.allowedExtensions">.jpg,.png</param>
-->
</interceptor-ref>
<result name="loginSuccess">/welcome.jsp</result>
<result name="loginLose" >/login.jsp</result>
<!-- 错误信息返回页面 -->
<result name="input">/{1}.jsp</result>
</action>
</package>
</struts>
設定後にエラーを表示する必要があります。ジャンプ先のページに表示するには、<s:actionerror> </ s:actionerror>を使用する必要があります
5.設定エラー中国語表示
なじみのある、
示されているエラープロンプトの分割、エラー番号
0:フィールド名
1.ファイル名
2.一時ファイル名
3.ファイルタイプ
デフォルトのエラーメッセージプロンプトの場所はstruts2-core.jar \ org.apache.struts2 \ struts-message.propertiesです。
図面はいくつかの国(中国語以外)のデフォルトのエラーメッセージです。
展開する例としてstruts-messages_en.propertiesを取り上げ
ます
。エラーメッセージは値キーで構成されていることがわかります。図の3行のコードは、より一般的に使用されるエラー表示です
。31。ファイルは最大値の
32 を超えています。ファイルタイプは送信できません
。33。ファイル拡張子は送信が許可されたサフィックス。
ここで、{0}、{1}、{2}、{3}は前のエラーメッセージ図のエラーシーケンス番号に対応します
理解した後、我々はSRC内(またはSRCパッケージ下)UserUpload.properties(xxx.properties)ファイルを作成し、我々は、カスタムエラーメッセージ(システムは16進数への入力中国に変換されます)を書くために、デフォルトの情報を模倣することができます
例コンテンツ
struts.messages.error.content.type.not.allowed="{1}"\u4E0D\u662F\u56FE\u7247\u7C7B\u578B
struts.messages.error.file.extension.not.allowed="{1}"\u540E\u7F00\u540D\u4E0D\u6EE1\u8DB3\u683C\u5F0F
有効にするには、struts.xmlで国際化を構成する必要があります。
追加後、struts.xmlのコードは
<struts>
<!-- 配置国际化 -->
<constant name="struts.custom.i18n.resources" value="UserUpload"></constant>
<!-- 设置最大允许上传的文件大小(字节),默认2M
<constant name="struts.multipart.maxSize" value="20480000"></constant>
-->
<package name="login" namespace="/" extends="struts-default">
<action name="UserAction_*" class="com.action.UserAction" method="{1}">
<interceptor-ref name="defaultStack">
<!-- 设置允许上传的文件类型(允许使用通配符) -->
<param name="fileUpload.allowedTypes">image/*</param>
<!-- 设置允许上传的文件后缀名
<param name="fileUpload.allowedExtensions">.jpg,.png</param>
-->
</interceptor-ref>
<result name="loginSuccess">/welcome.jsp</result>
<result name="loginLose" >/login.jsp</result>
<!-- 错误信息返回页面 -->
<result name="input">/{1}.jsp</result>
</action>
</package>
</struts>
デモ画像
6.複数ファイルのアップロード(手順はここにあり、詳細な説明はありません)
1.複数ファイルのアップロードでは、JSP <s:file label = "xxx" name = "xxx" /に複数のファイルアップロード要素またはstruts2タグを設定するだけで済みます。 >
2.アクションコードで受信したファイルの3つのフィールドがすべて配列型に変更されます(getおよびsetメソッドの再注入)
3.ロジックの一部が処理されます
ファイルのダウンロード(ここでは動的ダウンロードが使用されます。静的を使用する場合は、fileNameを固定値に置き換えます)
ファイルのアップロードと比較して、ファイルのダウンロードははるかに単純です(個人的に考える)
ファイルのダウンロードは実際には結果タイプです(ストリーム)
JSPコード
<s:form action="UserAction_download">
<s:textfield label="输入下载的文件名(含后缀名)" name="fileName"/>
<s:submit value="下载"></s:submit>
</s:form>
アクションコード
package com.action;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
//提供输入流,需要get方法,set文件下载时方法可有可无
private InputStream inputStream;
private String fileName;
public String download() throws FileNotFoundException, UnsupportedEncodingException {
//将文件转为输入流
String path = "H:/JAVAEE/images/" + fileName;
inputStream = new FileInputStream(path);
//由于重新转到网页,所以文件名含中文时需要行url转码
fileName = URLEncoder.encode(fileName,"UTF-8");
return "download";
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getInputStream() {
return inputStream;
}
}
struts.xmlコード
<struts>
<package name="login" namespace="/" extends="struts-default">
<action name="UserAction_*" class="com.action.UserAction" method="{1}">
<result name="download" type="stream">
<!-- 配置输出流 -->
<param name="inputName">inputStream</param>
<!-- 设置响应头消息,使浏览器以下载方式打开 固定格式:attachment;filename=xxx -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!-- 设置响应头消息,告诉浏览器响应正文的MIME类型 固定格式:application/octet-stream -->
<param name="contentType">application/octet-stream</param>
</result>
</action>
</package>
</struts>
デモ画像