Struts2實(shí)現(xiàn)文件上傳功能
Servlet 3.0規(guī)范的HttpServletRequest已經(jīng)提供了方法來(lái)處理文件上傳但這種上傳需要在Servlet中完成。而Struts2則提供了更簡(jiǎn)單的封裝。
Struts2默認(rèn)使用的是Jakarta的Common-FileUpload的文件上傳框架,因此使用Struts2的文件上傳功能,則需要添加兩個(gè)jar包,即commons-io-2.2.jar和commons-fileupload-1.3.1.jar。
Struts2簡(jiǎn)單文件上傳示例:
1.文件上傳頁(yè)面
為了能上傳文件,表單的method必須設(shè)置為POST,并且enctype設(shè)置為multipart/form-data。一旦設(shè)置了enctype為multipart/form-data,此時(shí)瀏覽器將會(huì)采用二進(jìn)制流的方式來(lái)處理表單數(shù)據(jù)。
<%@ taglib prefix="s" uri="/struts-tags" %> <%-- Created by IntelliJ IDEA. User: Administrator Date: 2018/1/16 Time: 14:06 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Struts2 簡(jiǎn)單文件上傳</title> </head> <body> <s:form action="file_upload" method="POST" enctype="multipart/form-data"> <s:file name="upload" label="選擇文件"/> <s:submit value="上傳"/> </s:form> </body> </html>
2.處理上傳請(qǐng)求的Action
/**
* Description:Struts2簡(jiǎn)單文件上傳
* Author: Eleven
* Date: 2018/1/24 10:39
*/
public class FileAction extends ActionSupport{
//上傳文件
private File upload;
//上傳文件類(lèi)型
private String uploadContentType;
//上傳文件名
private String uploadFileName;
//文件上傳允許的類(lèi)型在struts.xml中使用param標(biāo)簽動(dòng)態(tài)設(shè)置了
private String allowTypes;
public String page(){
return "page";
}
public void upload() {
//文件上傳:
//1.讀取文件內(nèi)容
//2.將文件內(nèi)容寫(xiě)到指定文件
try{
System.out.println("文件上傳允許的類(lèi)型="+allowTypes);
String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
System.out.println("項(xiàng)目的絕對(duì)路徑="+realPath);
//創(chuàng)建文件保存目錄
new File(realPath).mkdir();
File file = new File(realPath+"/"+uploadFileName);
//文件不存在則創(chuàng)建
if(!file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
FileInputStream in = new FileInputStream(upload);
byte[] buffer = new byte[1024];
int len = 0;
//邊讀邊寫(xiě) 每次讀取1kb 寫(xiě)1kb
while((len = in.read(buffer))>0){
out.write(buffer,0,len);
}
System.out.println("文件上傳成功...");
}catch(Exception e){
e.printStackTrace();
}
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getAllowTypes() {
return allowTypes;
}
public void setAllowTypes(String allowTypes) {
this.allowTypes = allowTypes;
}
}
如果表單中包含一個(gè)name屬性為xxx的文件域,則對(duì)應(yīng)的Action中需要使用三個(gè)成員變量來(lái)封裝該文件域的信息。
類(lèi)型為File的xxx成員變量封裝了該文件域?qū)?yīng)的文件內(nèi)容。
類(lèi)型為String的xxxFileName成員變量封裝了該文件域?qū)?yīng)的文件的文件名。
類(lèi)型為String的xxxContentType成員變量封裝了該文件域?qū)?yīng)的文件的文件類(lèi)型。
3.配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!--文件上傳-->
<action name="file_*" class="eleven.action.FileAction" method="{1}">
<result name="page">/WEB-INF/jsp/fileUpload.jsp</result>
<!--動(dòng)態(tài)設(shè)置action的屬性,這里舉例設(shè)置了允許文件上傳的類(lèi)型,但是action程序中并未做過(guò)多的處理-->
<param name="allowTypes">image/png,image/gif,image/jpeg</param>
</action>
</package>
</struts>
攔截器實(shí)現(xiàn)文件過(guò)濾
Struts2提供了一個(gè)文件上傳的攔截器,fileUpload,為了讓該攔截器起作用,要在action中配置攔截器引用。
配置fileUpload攔截器時(shí),可以為其指定兩個(gè)參數(shù):
allowTypes:允許上傳的文件類(lèi)型,多個(gè)文件類(lèi)型之間用英文逗號(hào),隔開(kāi)
maximumSize:允許上傳的文件大小,單位是字節(jié)。
當(dāng)文件過(guò)濾失敗后,系統(tǒng)自動(dòng)轉(zhuǎn)入input邏輯視圖,因此必須為該Action配置名為input的邏輯視圖。除此之外,還必須顯示地為該Action配置defaultStack的攔截器引用。
struts.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!--文件上傳-->
<action name="file_*" class="eleven.action.FileAction" method="{1}">
<!--配置fileUpload攔截器 且配置在defaultStack攔截器棧之前-->
<interceptor-ref name="fileUpload">
<!--允許上傳的文件類(lèi)型-->
<param name="allowedTypes">image/png,image/gif,image/jpeg</param>
<!--允許上傳文件大小-->
<param name="maximumSize">2000</param>
</interceptor-ref>
<!--配置系統(tǒng)默認(rèn)攔截器-->
<interceptor-ref name="defaultStack"/>
<!--配置input視圖頁(yè)面-->
<result name="input">/WEB-INF/jsp/input.jsp</result>
<result name="page">/WEB-INF/jsp/fileUpload.jsp</result>
</action>
</package>
</struts>
上面配置的文件上傳的攔截器,要求文件上傳的類(lèi)型只能是圖片文件,并且文件大小不能大于2000字節(jié),如果上傳文件太大,或者類(lèi)型不符合,則將跳轉(zhuǎn)到input邏輯視圖。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- struts2單個(gè)文件上傳的兩種實(shí)現(xiàn)方式
- 關(guān)于Struts2文件上傳與自定義攔截器
- Struts2+jquery.form.js實(shí)現(xiàn)圖片與文件上傳的方法
- JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載
- struts2+jsp實(shí)現(xiàn)文件上傳的方法
- struts2實(shí)現(xiàn)多文件上傳的示例代碼
- java中Struts2文件上傳問(wèn)題詳解
相關(guān)文章
SpringBoot+Redis執(zhí)行l(wèi)ua腳本的5種方式總結(jié)
Lua是一種快速、輕量級(jí)的腳本語(yǔ)言,廣泛應(yīng)用于各種領(lǐng)域,包括數(shù)據(jù)庫(kù),Redis作為一個(gè)內(nèi)嵌Lua解釋器的NoSQL數(shù)據(jù)庫(kù),允許通過(guò)Lua腳本在服務(wù)器端執(zhí)行一些復(fù)雜的操作,本文給大家介紹了使用SpringBoot Redis執(zhí)行l(wèi)ua腳本的五種方式,需要的朋友可以參考下2023-11-11
關(guān)于controller的異常處理及service層的事務(wù)控制方式
這篇文章主要介紹了關(guān)于controller的異常處理及service層的事務(wù)控制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
spring aop之@AfterReturning不生效問(wèn)題及解決
這篇文章主要介紹了spring aop之@AfterReturning不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
springboot集成redis并使用redis生成全局唯一索引ID
本文主要介紹了springboot集成redis并使用redis生成全局唯一索引ID,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
java 中的instanceof用法詳解及instanceof是什么意思(推薦)
instanceof 是 Java 的保留關(guān)鍵字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類(lèi)的實(shí)例,返回 boolean 的數(shù)據(jù)類(lèi)型。接下來(lái)通過(guò)本文給大家介紹java 中的instanceof用法詳解及instanceof是什么意思,需要的朋友參考下吧2017-11-11

