程序要求:
1.文件上傳名不能爲空,
2.文件上傳的類型必須是java zip格式
文件上傳大小必須是5M
第一種方法是通過javascript校驗來限制,獲取input的value然後截取擴展名進行判斷即可。
第二種是根據struts2自帶的fileupload攔截器中提供的allowedTypes來進行限制,步驟如下:
1 配置fileupload攔截器
struts.xml文件中的代碼如下:
<struts>
<!-- 常量的配置文件 -->
<includefile="struts-constant.xml"/>
<packagename="user"namespace="/csdn"extends="struts-default">
<!-- 全局結果集 -->
<global-results>
<resultname="input">/index.jsp</result>
</global-results>
<actionname="FileAction_*"class="www.csdn.struts_upload_interceptor.action.FileAction"method="{1}">
<interceptor-refname="fileUpload">
<!-- 上傳文件類型的限制 上傳java,zip格式文件-->
<paramname="allowedTypes"> application/octet-stream,application/x-zip-compressed
</param>
<!-- 上傳文件大小的設置以byte爲單位 1M=1024KB=1024*1024B 5M=5242880B 默認爲2M-->
<paramname="maximumSize">5242880</param>
</interceptor-ref>
<!-- 默認攔截器棧 -->
<interceptor-refname="defaultStack"/>
<resultname="success">/index.jsp</result>
</action>
</package>
</struts>
上面配置的是上傳文件類型的限制,其實共有兩個參數:
maximumSize (可選)- 這個攔截器允許的上傳到action中的文件最大長度(以byte爲單位).注意這個參數和在webwork.properties中定義的屬性沒有關係,默認2MB
allowedTypes (可選)- 以逗號分割的contentType類型列表(例如text/html),這些列表是這個攔截器允許的可以傳到action中的contentType.如果沒有指定就是允許任何上傳類型.Tomcat/conf/web.xml文件中就有文件的類型的名稱
文件大小的設置需在常量配置xml的文件中進行如下配置:
<!-- 設置文件上傳的大小 value必須大於或等於攔截器中的值 -->
<constantname="struts.multipart.maxSize"value="5242880"></constant>
2 jsp頁面定義如下(testFileUpload.jsp)
<body>
上傳文件<br>
<hr>
錯誤信息:
<s:fielderror></s:fielderror><br>
action錯誤信息:
<s:actionerror/>
<hr>
<div>
<form action="${pageContext.request.contextPath }/csdn/FileAction_upload.action"method="post"enctype="multipart/form-data">
文件上傳:<inputname="upload"type="file"><br>
<inputtype="submit"value="上傳">
</form>
</div>
</body>
添加struts2標籤:
<%@ tagliburi="/struts-tags"prefix="s"%>
3 後臺的FileAction聲明如下
public class FileAction extends ActionSupport {
private Filefile;//上傳的文件
private StringcontentType;//文件類型
private Stringfilename;//文件名
private Stringpath;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public void setUpload(File file) {
this.file = file;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}
public String upload()
{
//創建文件路徑
String path=ServletActionContext.getServletContext().getRealPath("WEB-INF/uploads");
//上傳路徑的文件
File pfile=new File(path);
//文件的路徑創建
if(!pfile.exists())
{
pfile.mkdirs();
}
try {
FileUtils.copyFile(file,new File(pfile,System.currentTimeMillis()+"_"+filename));
System.out.println("文件上傳成功。。。。。。。。。。");
returnSUCCESS;
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
return INPUT;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
}
注意:如果jsp中file的name="xxx",那麼後臺action中的屬性要做相應更改爲
private File xxx;
private String xxxContentType;
private String xxxFileName;
同時注意大小寫一定要一致
4.文件名不能爲空的問題:
在FileAction文件的同目錄下,建一個FileAction-validation.xml,編寫代碼如下:
<fieldname="upload">
<field-validatortype="requiredstring">
<paramname="trim">true</param>
<message>文件名不能爲空</message>
</field-validator>
</field>
運行效果圖:
1
2.上傳的文件類型不對,
3.文件名爲空
出現的bug及解決:
bug:上傳一個文件後,總會出現一個信息錯誤,即出現文件名不能爲空的提示信息
bug的原因:文本框中的value值本來就是空的 所以文件名不能爲空的問題不能在第4步中寫,直接在Action中進行判斷就可。
解決:在FileAction的upload方法中進行以下判斷:
if("".equals(file) || file==null)
{
System.out.println("文件名不能爲空");
}
再運行,程序則正常顯示了,不會再出現文件名不能爲空的信息。