java中Struts2 的文件上傳和下載示例
文件上傳
- 表單準(zhǔn)備
- 要想使用 HTML 表單上傳一個(gè)或多個(gè)文件
- 須把 HTML 表單的 enctype 屬性設(shè)置為
multipart/form-data
- 須把 HTML 表單的method 屬性設(shè)置為 post
- 需添加
<input type=“file”>
字段.
- Struts 對(duì)文件上傳的支持
- 在 Struts 應(yīng)用程序里, FileUpload 攔截器和 Jakarta Commons FileUpload 組件可以完成文件的上傳.
- 步驟:
- 在 Jsp 頁(yè)面的文件上傳表單里使用 file 標(biāo)簽. 如果需要一次上傳多個(gè)文件, 就必須使用多個(gè) file 標(biāo)簽, 但它們的名字必須是相同的
- 在 Action 中新添加 3 個(gè)和文件上傳相關(guān)的屬性. 這 3 個(gè)屬性的名字必須是以下格式
- 基本的文件的上傳: 直接在 Action 中定義如下 3 個(gè)屬性, 并提供對(duì)應(yīng)的 getter 和 setter
- [File Name] : 類型-File -被上傳的文件。例如:data(fileName要求和文件表單項(xiàng)的name一致)
- [File Name]ContentType : 類型-String -上傳文件的文件類型。例如:dataContentType(用來(lái)接收文件類型(MIME值))
- [File Name]FileName : String -上傳文件的文件名。例如:dataFileName (用來(lái)接收文件的名字)
- 如果上傳多個(gè)文件, 可以使用 List
- 若傳遞多個(gè)文件, 則上述的 3 個(gè)屬性, 可以改為 List 類型! 多個(gè)文件域的 name 屬性值需要一致.
- 示例代碼
<s:form action="testUpload" enctype="multipart/form-data"> <s:textfield name="userName[0]" label="用戶-1"></s:textfield> <s:file name="photos" label="照片"></s:file> <s:textfield name="userName[1]" label="用戶-2"></s:textfield> <s:file name="photos" label="照片"></s:file> <s:textfield name="userName[2]" label="用戶-3"></s:textfield> <s:file name="photos" label="照片"></s:file> <s:submit value="提交"></s:submit> </s:form>
public class UploadAction extends ActionSupport{ @Setter@Getter private List<File> photos; @Setter@Getter private List<String> photosContentType; @Setter@Getter private List<String> photosFileName; @Setter@Getter private List<String> userName; public String testUpload() throws IOException { System.out.println("userName: "+userName); System.out.println("photos: "+photos); System.out.println("photosFileName: "+ photosFileName); System.out.println("photosContentType: "+photosContentType); // 將文件傳到服務(wù)器根目錄下upload文件下 // 獲取ServletContext ServletContext servletContext = ServletActionContext.getServletContext(); //獲取真實(shí)路徑 String realPath = servletContext.getRealPath("/upload"); System.out.println(realPath); File uploadFile = new File(realPath); //判斷路徑是否存在 if (!uploadFile.exists()){ //不存在創(chuàng)建 uploadFile.mkdir(); } for (int i = 0; i < photos.size(); i++) { UUID uuid = UUID.randomUUID(); FileUtils.copyFile(photos.get(i), new File(realPath + "/" + uuid + photosFileName.get(i))); } return SUCCESS; } }
1.處理幾個(gè)小問(wèn)題?
1.文件名重名,一般可以在文件名的前面生成一個(gè)UUID作為前綴。
2.限制單個(gè)文件的大小
3.限制文件的類型
4.限制總文件的大小
2.在Struts2 中提供了 FileUpload 攔截器 可以給我們?cè)O(shè)置這些屬性值
FileUpload 攔截器有 3 個(gè)屬性可以設(shè)置.
- maximumSize: 上傳單個(gè)文件的最大長(zhǎng)度(以字節(jié)為單位), 默認(rèn)值為 2 MB
- allowedTypes: 允許上傳文件的類型, 各類型之間以逗號(hào)分隔
- allowedExtensions: 允許上傳文件擴(kuò)展名, 各擴(kuò)展名之間以逗號(hào)分隔
- 可以在 struts.xml 文件中覆蓋這 3 個(gè)屬性
注意: 在 org.apache.struts2 下的 default.properties 中有對(duì)上傳的文件總的大小的限制. 可以使用常量的方式來(lái)修改該限制struts.multipart.maxSize=2097152
<constant name="struts.devMode" value="true"/> <!-- 在這修改總文件的的大小 --> <constant name="struts.multipart.maxSize" value="2097152"/> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor-stack name="myInterceptor"> <interceptor-ref name="defaultStack"> <!-- 修改單個(gè)文件大小,Commons FileUpload 組件默認(rèn)接受上傳文件總的最大值為 2M --> <param name="fileUpload.maximumSize">57,408</param> <!-- 允許上傳的文件類型 --> <param name="fileUpload.allowedTypes">image/pjpeg,image/gif</param> <!-- 允許上傳文件的擴(kuò)展名 --> <param name="fileUpload.allowedExtensions">jpg,gif</param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myInterceptor"></default-interceptor-ref> <action name="testUpload" class="org.pan.action.UploadAction" method="testUpload"> <result name="success">/WEB-INF/views/success.jsp</result> <result name="input">/upload.jsp</result> </action> </package>
一.上傳文件相關(guān)的錯(cuò)誤消息?
1.與文件上傳有關(guān)的出錯(cuò)消息在 struts-messages.properties 文件里預(yù)定義.
2.可以在文件上傳 Action 相對(duì)應(yīng)的資源文件 或者 在 i18n_zh_CN.properties 國(guó)際化資源文件中重新定義錯(cuò)誤消息
struts.messages.error.file.too.large=你傳的文件太大了 struts.messages.error.content.type.not.allowed=文件類型錯(cuò)誤 struts.messages.error.file.extension.not.allowed=擴(kuò)展名錯(cuò)誤 struts.messages.upload.error.SizeLimitExceededException=文件總大小超過(guò)上限
文件下載
-
在某些應(yīng)用程序里, 可能需要?jiǎng)討B(tài)地把一個(gè)文件發(fā)送到用戶的瀏覽器中, 而這個(gè)文件的名字和存放位置在編程時(shí)是無(wú)法預(yù)知的
- Stream 結(jié)果類型
- Struts 專門(mén)為文件下載提供了一種 Stream 結(jié)果類型. 在使用一個(gè) Stream 結(jié)果時(shí), 不必準(zhǔn)備一個(gè) JSP 頁(yè)面.
- Stream 結(jié)果類型可以設(shè)置如下參數(shù):
- contentType:被下載的文件的 MIME 類型。默認(rèn)值為 text/plain
- contentLength:被下載的文件的大小,以字節(jié)為單位
- contentDisposition: 可以設(shè)置下載文件名的ContentDispositon 響應(yīng)頭,默認(rèn)值為 inline,通常設(shè)置為如下格式:
- attachment;filename="document.pdf".
- inputName:Action 中提供的文件的輸入流。默認(rèn)值為 inputStream
- bufferSize:文件下載時(shí)緩沖區(qū)的大小。默認(rèn)值為 1024
- allowCaching :文件下載時(shí)是否允許使用緩存。默認(rèn)值為 true
- contentCharSet:文件下載時(shí)的字符編碼。
- 以上參數(shù)可以在 Action 中以 getter 方法的方式提供!
- 以上參數(shù)可以在 Action 中以 getter 方法的方式提供!
- Stream 結(jié)果類型的參數(shù)可以在 Action 以屬性的方式覆蓋
- 具體使用細(xì)節(jié)參看 struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html
-
示例代碼
<a href="testDownLoad">下載</a>
public class DownLoadAction extends ActionSupport{ //通常以下這幾個(gè)參數(shù)會(huì)在Action 中提供 @Setter@Getter private String contentType; @Setter@Getter private long contentLength; @Setter@Getter private String contentDisposition; @Setter@Getter private InputStream inputStream; public String testDownLoad() throws FileNotFoundException, UnsupportedEncodingException { //獲取ServletContext ServletContext servletContext = ServletActionContext.getServletContext(); //獲取文件的路徑 String realPath = servletContext.getRealPath("/WEB-INF/file/至少還有你.mp3"); //獲取文件的流 inputStream = new FileInputStream(realPath); //設(shè)置文件的類型 contentType = servletContext.getMimeType(realPath); //獲取文件的長(zhǎng)度 contentLength = new File(realPath).length(); //設(shè)置文件名 String fileName = "至少還有你.mp3"; fileName = new String(fileName.getBytes("gbk"),"iso8859-1"); contentDisposition = "attachment;filename="+fileName; return SUCCESS; } }
<!-- 文件下載 --> <action name="testDownLoad" class="org.pan.action.DownLoadAction" method="testDownLoad"> <result type="stream"> <!-- 文件緩沖大小 --> <param name="bufferSize">2048</param> </result> </action>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- struts2實(shí)現(xiàn)簡(jiǎn)單文件下載功能
- JSP開(kāi)發(fā)之Struts2實(shí)現(xiàn)下載功能的實(shí)例
- struts2實(shí)現(xiàn)文件下載功能
- Struts2實(shí)現(xiàn)文件下載功能代碼分享(文件名中文轉(zhuǎn)碼)
- java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載
- java中struts2實(shí)現(xiàn)文件上傳下載功能
- JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- struts2實(shí)現(xiàn)文件下載功能
相關(guān)文章
SpringCloud @RefreshScope注解源碼層面深入分析
@RefreshScope注解能幫助我們做局部的參數(shù)刷新,但侵入性較強(qiáng),需要開(kāi)發(fā)階段提前預(yù)知可能的刷新點(diǎn),并且該注解底層是依賴于cglib進(jìn)行代理的,所以不要掉入cglib的坑,出現(xiàn)刷了也不更新情況2023-04-04java 合并排序算法、冒泡排序算法、選擇排序算法、插入排序算法、快速排序算法的描述
算法是程序設(shè)計(jì)的精髓,程序設(shè)計(jì)的實(shí)質(zhì)就是構(gòu)造解決問(wèn)題的算法,將其解釋為計(jì)算機(jī)語(yǔ)言。2009-06-06解析Springboot集成Tile38客戶端之Set命令實(shí)現(xiàn)示例
這篇文章主要為大家介紹了解析Springboot集成Tile38客戶端之Set命令實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08詳解Spring Data操作Redis數(shù)據(jù)庫(kù)
Redis是一種NOSQL數(shù)據(jù)庫(kù),Key-Value形式對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),其中數(shù)據(jù)可以以內(nèi)存形式存在,也可以持久化到文件系統(tǒng)。Spring data對(duì)Redis進(jìn)行了很好的封裝,用起來(lái)也是十分的得心應(yīng)手,接下來(lái)通過(guò)本文給大家分享Spring Data操作Redis數(shù)據(jù)庫(kù),需要的朋友參考下2017-03-03java Lombok之@Accessors用法及說(shuō)明
這篇文章主要介紹了java Lombok之@Accessors用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03解決IDEA上循環(huán)依賴報(bào)錯(cuò)問(wèn)題Error:java: Annotation processing&n
這篇文章主要介紹了解決IDEA上循環(huán)依賴報(bào)錯(cuò)問(wèn)題Error:java: Annotation processing is not supported for module cycles,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2023-10-10Java?Zookeeper分布式分片算法超詳細(xì)講解流程
ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等2023-03-03