zyUpload+struct2完成文件上傳

前言:

  最近在寫自己的博客網站,算是強化一下自己對s2sh框架的理解。期間遇到了很多問題,這些問題在寫之前都考慮過,感覺也就是那樣吧。但正真遇到了,也挺讓人難受的。就利用zyUpload這個js插件實現文件的上傳, 我來談一談。

zyUpload下載:

  https://github.com/hjzgg/zyUpload?,或者可以在網上,隨便就可以下載到,只不過提供的網址中的zyUpload是我改過的。

zyUpload界面效果:

zyUpload使用需要注意的幾個地方: 

   說明:zyUpload 配合Strus2實現圖片或文件的上傳

  (1)zyFile.js,lanrenzhijia.js,zyUpload.js設置 url : "fileUploadAction!execute", // 上傳文件的路徑
  (2)文件的上傳通過 zyFile.js中的funUploadFile函數,修改formdata.append("upload", file) file對應的name屬性值,這里是"upload",保證和后臺的name屬性值一樣!上傳的代碼如下:

     // 上傳多個文件funUploadFiles : function(){var self = this;  // 在each中this指向沒個v  所以先將this保留// 遍歷所有文件  ,在調用單個文件上傳的方法$.each(this.uploadFile, function(k, v){self.funUploadFile(v);});},// 上傳單個個文件funUploadFile : function(file){var self = this;  // 在each中this指向沒個v  所以先將this保留var formdata = new FormData();formdata.append("upload", file);                     var xhr = new XMLHttpRequest();// 綁定上傳事件// 進度xhr.upload.addEventListener("progress",     function(e){// 回調到外部
                self.onProgress(file, e.loaded, e.total);}, false); // 完成xhr.addEventListener("load", function(e){// 從文件中刪除上傳成功的文件  false是不執行onDelete回調方法self.funDeleteFile(file.index, false);// 回調到外部
                self.onSuccess(file, xhr.responseText);if(self.uploadFile.length==0){// 回調全部完成方法self.onComplete("全部完成");}}, false);  // 錯誤xhr.addEventListener("error", function(e){// 回調到外部
                self.onFailure(file, xhr.responseText);}, false);  xhr.open("POST", self.url, true);xhr.send(formdata);},


  (3)缺陷就是只能單個文件上傳!用的是FormData對象,利用ajax技術,每次上傳都要請求后臺。
  (4)zyFile.js中的一些接口都是在zyUpload.js中實現!

     下面是zyFile.js中的一些接口

     filterFile : function(files){ // 提供給外部的過濾文件格式等的接口,外部需要把過濾后的文件返回
        },onSelect : function(selectFile, files){      // 提供給外部獲取選中的文件,供外部實現預覽等功能  selectFile:當前選中的文件  allFiles:還沒上傳的全部文件
            },onDelete : function(file, files){            // 提供給外部獲取刪除的單個文件,供外部實現刪除效果  file:當前刪除的文件  files:刪除之后的文件
            },onProgress : function(file, loaded, total){  // 提供給外部獲取單個文件的上傳進度,供外部實現上傳進度效果
            },onSuccess : function(file, responseInfo){    // 提供給外部獲取單個文件上傳成功,供外部實現成功效果
            },onFailure : function(file, responseInfo){    // 提供給外部獲取單個文件上傳失敗,供外部實現失敗效果
        },onComplete : function(responseInfo){         // 提供給外部獲取全部文件上傳完成,供外部實現完成效果
            },

    zyFile.js中filterFile給外部提供的函數接口在 zyUpload.js可以找到,用來進行文件的過濾!對于filterFile這個借口,實現如下(當然,你可以根據自己的需求自己來實現,我這里只是想上傳圖片文件而已):

            this.funFilterEligibleFile = function(files){var arrFiles = [];  // 替換的文件數組for (var i = 0, file; file = files[i]; i++) {if (file.size >= 51200000) {alert('您這個"'+ file.name +'"文件大小過大');    } else {// 在這里需要判斷當前所有文件中var fileExt = file.name.substr(file.name.lastIndexOf(".")).toLowerCase();//獲得文件后綴名if(fileExt==".png" || fileExt==".gif" || fileExt==".jpg" || fileExt==".jpeg")arrFiles.push(file);//如果文件是圖片格式,那么就放入文件的數組    else {alert("文件僅限于 png, gif, jpeg, jpg格式 !");}}}return arrFiles;};
filterFile:
function(files) {// 過濾合格的文件return self.funFilterEligibleFile(files);},

struct2后臺處理:

1.structs.xml中配置文件上傳解析器

 <!-- struct2默認使用jakarta的Common-FileUpload的文件上傳解析器 -->
  <constant name="struts.multipart.parser" value="jakarta"/>

2.structs.xml中action的配置

  <action name="fileUploadAction" class="fileUploadAction" method="struts-default"><param name="savePath">/fileUpload</param><result name="errors" type="redirect">/errorsMessage/fileErrorsTip.jsp</result><result name="operations" type="redirect">/operationsMessage/fileOperationsTip.jsp</result></action>

3.dao層

public class PictureDao implements Serializable{private SessionFactory sessionFactory;public SessionFactory getSessionFactory() {return sessionFactory;}public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}private Session getSession(){return sessionFactory.getCurrentSession();}public PictureGroup pictureJspGetOneGroup(int groupId){//得到相冊的分組PictureGroup pictureGroup = null;Session session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();pictureGroup = (PictureGroup)session.createQuery("from PictureGroup where groupId="+groupId).list().get(0);tran.commit();} catch(Exception e) {System.out.println(e.toString());tran.rollback();return null;}return pictureGroup;}public String newMyPicture(MyPicture myPicture){//持久化圖片信息Session session = null;Transaction tran = null;try{session = this.getSession();tran = session.beginTransaction();session.persist(myPicture);tran.commit();} catch(Exception e){System.out.println(e.toString());tran.rollback();return e.toString();}return null;}}

4.action部分

public class FileUploadAction extends ActionSupport{private PictureDao pictureDao;public PictureDao getPictureDao() {return pictureDao;}public void setPictureDao(PictureDao pictureDao) {this.pictureDao = pictureDao;}private List<File>    upload; // 上傳的文件private List<String> uploadFileName; // 文件名稱private List<String> uploadContentType; // 文件類型private String savePath;public List<File> getUpload() {return upload;}public void setUpload(List<File> upload) {this.upload = upload;}public List<String> getUploadFileName() {return uploadFileName;}public void setUploadFileName(List<String> uploadFileName) {this.uploadFileName = uploadFileName;}public List<String> getUploadContentType() {return uploadContentType;}public void setUploadContentType(List<String> uploadContentType) {this.uploadContentType = uploadContentType;}public String getSavePath() {return savePath;}public void setSavePath(String savePath) {this.savePath = savePath;}private String pictureName = null;private String picturePath = null;private String pictureGroupId = null;public String fileUploadSuccess(){//添加一張圖片try{MyPicture myPicture = new MyPicture();myPicture.setPictureName(pictureName);myPicture.setPicturePath(picturePath);myPicture.setPictureBuildTime(new Timestamp(System.currentTimeMillis()));PictureGroup pictureGroup = pictureDao.pictureJspGetOneGroup(Integer.parseInt(pictureGroupId));//為了得到持久化的相冊分組對象if(pictureGroup == null) throw new NullPointerException("分組為空!");myPicture.setGroup(pictureGroup);String msg = pictureDao.newMyPicture(myPicture);ActionContext.getContext().getSession().put("operations", "圖片" + pictureName + (msg==null ? "上傳成功!" : "上傳失敗:"+msg));} catch (Exception e){System.out.println(e.toString());ActionContext.getContext().getSession().put("errors", "圖片" + pictureName + "添加失敗: " + e.toString() + " 異常位置: FileUploadAction!fileUploadSuccess。");return "errors";}return "operations";}@Overridepublic String  execute() throws Exception {try{// 取得需要上傳的文件數組List<File> files = getUpload();HttpServletRequest request = ServletActionContext.getRequest();//得到 到 項目根目錄的URLString url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();if (files != null && files.size() > 0) {String realPath = ServletActionContext.getServletContext().getRealPath(savePath);//多個文件的上傳
//                for (int i = 0; i < files.size(); i++) {
//                    String fileName = System.currentTimeMillis()+getUploadContentType().get(i).replace("/", ".");
//                    picturesPath.add(url+savePath+"/"+fileName);
//                    FileOutputStream fos = new FileOutputStream(realPath + "\\" + fileName);
//                    FileInputStream fis = new FileInputStream(files.get(i));
//                    byte[] buffer = new byte[1024];
//                    int len = 0;
//                    while ((len = fis.read(buffer)) > 0) {
//                        fos.write(buffer, 0, len);
//                    }
//                    fis.close();
//                    fos.close();
//                }if((pictureGroupId=(String)ActionContext.getContext().getSession().get("pictureGroupId")) == null){//未選擇分組ActionContext.getContext().getSession().put("operations", "圖片"+uploadFileName+"上傳失敗,分組未選擇! <a target='_parent' href='../pictureAction!pictureGroupJspGetAllGroups'>選擇分組</a>");return "operations";}//處理單個文件的上傳String fileName = System.currentTimeMillis()+getUploadFileName().get(0)+getUploadContentType().get(0).replace("/", ".");FileOutputStream fos = new FileOutputStream(realPath + "\\" + fileName);FileInputStream fis = new FileInputStream(files.get(0));byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) > 0) {fos.write(buffer, 0, len);}fis.close();fos.close();picturePath = url+savePath+"/"+fileName;pictureName = getUploadFileName().get(0);return fileUploadSuccess();} else {ActionContext.getContext().getSession().put("errors", "得到文件數目為0! 異常位置:FileUploadAction!execute。");}} catch (Exception e){System.out.println(e.toString());ActionContext.getContext().getSession().put("errors",  "圖片" + getUploadFileName().get(0) + "上傳失敗: " + e.toString()+"異常位置:FileUploadAction!execute。");return "errors";}return "errors";}
}

5.說一下Action中的一些信息:

  String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); 得到請求項目的地址,如http://localhost:8080/myBlog;

  String fileName =?System.currentTimeMillis()+getUploadFileName().get(0)+

          ? ? ?getUploadContentType().get(0).replace("/", "."); 生成唯一文件名稱

  String realPath = ServletActionContext.getServletContext().getRealPath(savePath);得到圖片的存儲地址

  picturePath = url+savePath+"/"+fileName;得到圖片的src地址

最終效果:

  1.上傳后,無論是失敗還是成功,都可以通過ajax從后臺得到!

  2.最后從后臺得到數據并展示

  好了,自己的博客網站算是差不多了,這一個多星期真是累尿了。接下來好好看看書,刷刷題,做做題,準備找工作吧。噢耶!!!

轉載于:https://www.cnblogs.com/hujunzheng/p/5084288.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gbd的簡單使用(一)

這篇文章將gdb的簡單使用&#xff0c;通過此篇文章你能學習到使用gdb進行調試程序 在Linux中編寫程序時&#xff0c;如何進行程序的debug工作呢&#xff1f;今天來介紹下gdb這個工具&#xff0c;可以在Linux下直接man gdb查看幫助信息 &#xff08;一&#xff09;gdb命令介紹 …

java發送內嵌圖片郵件

前言&#xff1a; 博客系統中需要郵件服務的功能&#xff0c;以前寫過類似的功能&#xff0c;不過功能太簡單了&#xff0c;僅僅是發送文本內容&#xff0c;現在嘗試一下發送內嵌圖片郵件&#xff01; 準備工作&#xff1a; 請參考&#xff1a;http://www.cnblogs.com/hujunzhe…

調試跟蹤利器---strace

通過這篇文章你會學習到strace的用法&#xff0c;strace可以幫助你高效地定位進程中的一些錯誤&#xff0c;關于strace的用處有很多&#xff0c;可以自行發掘 前面我們講解了gdb調試程序,這篇文章介紹另一個調試跟蹤工具strace&#xff0c;同樣你可以在linux下執行man strace查…

MBR、DBR、FAT32基礎小知識

MBR-------主引導記錄 1.創建時間&#xff1a;由分區軟件&#xff08;Fdisk/PartitionMagic/Windows 2000/Windows XP安裝 工具等&#xff09;給 硬盤分區時建立的。 2.功能 &#xff1a;存放硬盤分區信息和引導系統時檢查分區。 3.作用范圍&#xff1a;MBR和虛擬MBR控制著整個…

java使用Executor(執行器)管理線程

一.一個實現了Runnable接口的類 class MyThread implements Runnable{private static int num 0;Overridepublic void run() {while(true){synchronized(MyThread.class){num;try{Thread.sleep(500);} catch(Exception e){System.out.println(e.toString());}System.out.print…

JMM和happens-before原則

JMM&#xff1a; Java Memory Model(Java內存模型)&#xff0c;圍繞著在并發過程中如何處理可見性、原子性、有序性這三個特性而建立的模型。 可見性&#xff1a; JMM提供了volatile變量定義、final、synchronized塊來保證可見性。  例如&#xff1a;線程a在將共享變量x1寫入…

SD卡移植FAT32文件系統無MBR

問題&#xff1a;在研究SD卡和FAT32文件系統的時候&#xff0c;發現SD卡有的有MBR&#xff0c;有的沒有MBR&#xff0c;這個為什么呢&#xff1f; 分析&#xff1a;MBR是主引導記錄&#xff0c;是在給磁盤分區的時候建立的&#xff0c;我們的SD卡沒有這個可能就是沒有進行過分區…

java獲取類的信息

關鍵技術剖析 1.java.lang.reflect包實現了java的反射機制&#xff0c;在使用反射機制時&#xff0c;需要導入該包。 2.Class類的forName方法能夠根據類名加載類&#xff0c;獲得類的Class對象。 Class類的getSuperclass方法獲得父類的Class對象&#xff1b;getDeclaredFields方…

FAT32文件系統介紹

FAT32文件系統&#xff08;一&#xff09;為什么要有文件系統&#xff08;二&#xff09;FAT32文件系統組成&#xff08;三&#xff09;分步介紹各部分(1) 首先介紹一下MBR(2)DBR介紹(3)FAT表介紹(4) 數據區&#xff08;一&#xff09;為什么要有文件系統 文件系統是操作系統用…

java中動態代理實現機制

前言&#xff1a; 代理模式是常用的java設計模式&#xff0c;它的特征是代理類與委托類有同樣的接口&#xff0c;代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類&#xff0c;以及事后處理消息等。代理類與委托類之間通常會存在關聯關系&#xff0c;一個代理類…

libiconv庫簡單裁剪支持CP437編碼

有許多人在做項目的時候都會遇到字符編碼的不一致導致的亂碼問題&#xff0c;那如何去解決呢&#xff1f;在Linux系統上可以通過iconv函數族來進行編碼轉換&#xff0c;但有時候我們并不需要全部的字符集&#xff0c;因為可能會占用比較大的空間&#xff0c;本文主要支持CP437編…

簡單java在線測評程序

簡單java程序在線測評程序 一&#xff0e;前言 大家過年好&#xff01;今年的第一篇博客啊&#xff01;家里沒有網&#xff0c;到處蹭無線&#xff01;日子過得真糾結&#xff01;因為畢設的需求&#xff0c;簡單寫了一個java程序在線測評程序&#xff0c;當然也可以在本地測試…

指針強制類型轉換觸發內存自動對齊

C語言的指針是我們操作很靈活&#xff0c;但是也留下了不少坑&#xff0c;今天工作遇到了一個指針的坑&#xff0c;這里復現一下&#xff1a; 指針類型強制轉換,并進行解引用,引起的內存對齊問題.&#xff08;一&#xff09;問題復現&#xff1a; 運行環境&#xff1a;Ubuntu …

簡單文本編輯器

一、前言 聚天地之靈氣&#xff0c;集日月之精華&#xff01;一個簡單的java文本編輯器由此而生。畢設所需&#xff0c;很是無奈&#xff01; 二、界面預覽 三、實現思路 1.字體選擇器的實現 (1).字體類 class MyFont{private Font font;private Color color;public Font getFo…

u-boot新增命令后出現data abort

&#xff08;一&#xff09;問題描述 u-boot下新增了一條update的命令&#xff0c;直接輸入update沒有報錯&#xff0c;但是輸入up按TAB鍵補全時發現出現data abort&#xff0c;而且輸入不支持的命令也會有data abort &#xff08;二&#xff09;解決方法 最開始我包含的頭…

sublime text學習

Ctrl / ---------------------注釋 Ctrl 滾動 --------------字體變大/縮小 Ctrl N-------------------新建 軟件右下角可以選擇文檔語法模式 Ctrl Shift P ------------------命令模式 命令&#xff1a; sshtml模糊匹配-----語法切換到html模式&#xff0c;同理所得&am…

core文件如何分析

目錄(一&#xff09;什么是coredump(二)coredump產生的條件&#xff08;1&#xff09;coredump產生主要原因&#xff1a;&#xff08;2&#xff09;如何生成coredump(三&#xff09;gdb使用(四&#xff09;實例調試coredump文件(五&#xff09;總結(一&#xff09;什么是coredu…

SpringMVC+FreeMarker

前言&#xff1a; 最近在學習SpringMVC&#xff0c;模板引擎用的是FreeMarker&#xff0c;之前沒有接觸過。利用SpringMVC開發其實還有許多的步驟&#xff0c;比如控制層&#xff0c;服務層&#xff0c;持久化層&#xff0c;實體等等&#xff0c;先弄了一個小demo來總結一下Spr…

SpringMVC那點事

一、SpringMVC返回json數據的三種方式 1、第一種方式是spring2時代的產物&#xff0c;也就是每個json視圖controller配置一個Jsoniew。 如&#xff1a;<bean id"defaultJsonView" class"org.springframework.web.servlet.view.json.MappingJacksonJsonView&q…

js學習內容的整理

1、jquery動態添加Table中的一行 function addTableRow(tableId){var html <tr>\......\</tr>";//行首插入一行if($(#tableId).find(tr).length 1){$(html).insertAfter($(#tableId).find(tr).eq(0));} else { $(html).insertBefore($(#tableId).find(tr).e…