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.mzph.cn/news/531356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java发送内嵌图片邮件

前言&#xff1a; 博客系统中需要邮件服务的功能&#xff0c;以前写过类似的功能&#xff0c;不过功能太简单了&#xff0c;仅仅是发送文本内容&#xff0c;现在尝试一下发送内嵌图片邮件&#xff01; 准备工作&#xff1a; 请参考&#xff1a;http://www.cnblogs.com/hujunzhe…

SD卡移植FAT32文件系统无MBR

问题&#xff1a;在研究SD卡和FAT32文件系统的时候&#xff0c;发现SD卡有的有MBR&#xff0c;有的没有MBR&#xff0c;这个为什么呢&#xff1f; 分析&#xff1a;MBR是主引导记录&#xff0c;是在给磁盘分区的时候建立的&#xff0c;我们的SD卡没有这个可能就是没有进行过分区…

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;当然也可以在本地测试…

简单文本编辑器

一、前言 聚天地之灵气&#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;解决方法 最开始我包含的头…

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…

(一)最邻近插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;最邻近插值实现&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;最邻近插值实现 一般情况下我…

(二)双线性插值python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;双线性插值原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;双线性插值原理 一般情况下我…

(三)图像转灰度图Python实现

这里写目录标题&#xff08;一&#xff09;原始图像&#xff08;二&#xff09;转换原理&#xff08;三&#xff09;python实现1. 安装库2. python程序编写3. 效果4. 工程文件&#xff08;一&#xff09;原始图像 &#xff08;二&#xff09;转换原理 &#xff08;三&#xff…

java泛型上下限

前言&#xff1a; java的泛型上下限不是很好理解&#xff0c;尤其像我这种菜鸡。反反复复看了好几遍了...&#xff0c;真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限&#xff08;extends 关键字&#x…

基于matlab的步进电机仿真(一)

这里写目录标题环境准备基础准备模型参数输入和输出仿真原理图仿真资源环境准备 MatLab2021b 基础准备 打开Matlab&#xff0c;在帮助文档里面搜索step motor,我们这里选择如下模型 该模型实现了一个通用的步进电机模型&#xff1a; 可变磁阻步进电机永磁或混合步进电机 …

java自定义类加载器

前言 java反射&#xff0c;最常用的Class.forName()方法。做毕设的时候&#xff0c;接收到代码字符串&#xff0c;通过 JavaCompiler将代码字符串生成A.class文件&#xff08;存放在classpath下&#xff0c;也就是eclipse项目中的bin目录里&#xff09;&#xff0c;然后通过jav…

repo介绍(一)

repo简介 Repo 是我们以 Git 为基础构建的代码库管理工具,可以组织多个仓库的上传和下载。它是由一系列的Python脚本组成&#xff0c;封装了一系列的Git命令&#xff0c;用来统一管理多个Git仓库 一个大型的项目可能由很多小的仓库组合而成的&#xff0c;为了方便统一管理各个…

hash长度扩展攻击

作为一个信息安全的人&#xff0c;打各个学校的CTF比赛是比较重要的&#xff01; 最近一个朋友发了道题目过来&#xff0c;发现有道题目比较有意思&#xff0c;这里跟大家分享下 这串代码的大致意思是&#xff1a; 这段代码首先引入了一个名为"flag.php"的文件&am…

repo介绍(二)

这篇文章来实例操作 安装repo&#xff0c;参考repo介绍这一节创建repo存放default.xml 的git仓库 初始化repo&#xff0c;repo init -u https://gitee.com/angerial/repo-test.git 这个时候会在当前目录生成如下文件 参考repo组成&#xff0c;修改.repo/manifest.xml,这里我的…