zyUpload+struct2完成文件上传

时间:2022-01-13 13:51:39

前言:

  最近在写自己的博客网站,算是强化一下自己对s2sh框架的理解。期间遇到了很多问题,这些问题在写之前都考虑过,感觉也就是那样吧。但正真遇到了,也挺让人难受的。就利用zyUpload这个js插件实现文件的上传, 我来谈一谈。

zyUpload下载:

  https://github.com/hjzgg/zyUpload ,或者可以在网上,随便就可以下载到,只不过提供的网址中的zyUpload是我改过的。

zyUpload界面效果:

zyUpload+struct2完成文件上传

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";
} @Override
public String execute() throws Exception {
try{
// 取得需要上传的文件数组
List<File> files = getUpload();
HttpServletRequest request = ServletActionContext.getRequest();
//得到 到 项目根目录的URL
String 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从后台得到!

zyUpload+struct2完成文件上传

  2.最后从后台得到数据并展示

zyUpload+struct2完成文件上传

  好了,自己的博客网站算是差不多了,这一个多星期真是累尿了。接下来好好看看书,刷刷题,做做题,准备找工作吧。噢耶!!!

zyUpload+struct2完成文件上传的更多相关文章

  1. java zyUpload 实现多文件上传

    1.html部分 <form enctype="multipart/form-data"> <label>请选择文件</label> <i ...

  2. Struct2 csv文件上传读取中文内容乱码

    网络上搜索下,发现都不适合 最终改写代码: FileInputStream fis = null; InputStreamReader isr = null; BufferedReader br= n ...

  3. 基于 Struts2 的单文件和多文件上传

    文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利.Struts2 已经有默认的 upload 拦截器.我们只需要写参数,它就会自 ...

  4. PHP结合zyupload多功能图片上传实例

    PHP结合zyupload多功能图片上传实例,支持拖拽和裁剪.可以自定义高度和宽度,类型,远程上传地址等. zyupload上传基本配置 $("#zyupload").zyUplo ...

  5. jquery&period;uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  6. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  7. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  8. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  9. &comma;net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

随机推荐

  1. 利用Object&period;prototype&period;toString方法,实现比typeof更准确的type校验

    Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型. 调用方法: Object.prototype.toString.call(value) 不同 ...

  2. webkit内核浏览器的CSS写法

    -webkit-tap-highlight-color: transparent; Mobile上点击链接高亮的时候设置颜色为透明 -webkit-user-select: none; 设置为无法选择 ...

  3. nginx反向代理实现跨域请求

    nginx反向代理实现跨域请求 跨域请求可以通过JSONP实现,缺点是需要修改被请求的服务器端代码进行配合,稍显麻烦通过在自己服务器上配置nginx的反向代理,可以轻松实现跨域请求 思路 示例服务器A ...

  4. Spring Controller参数为空串的处理方式

    控制器参数为String类型 Spring框架接收到传入的空串后,此参数被赋值为空串,不为null. 控制器参数为非String类型 Spring框架接收到传入的空串后,此参数被赋值为null.

  5. 没有找到iertutil&period;dll怎么办?快速解决iertutil&period;dll丢失

    iertutil.dll 是存放在 C:\Windows\System32 目录下的一个动态链接库文件,它提供函数给其他程序所调用.iertutil.dll 能够实现接到互联网,纪录输入,监控应用程序 ...

  6. GWAS研究中case和control的比例是有讲究的?

    GWAS研究中,表型分两种.第一种是线性的表型,如果身高.体重.智力等:第二种是二元的表型,比如患病和未患病,即通常所说的case和control.对于表型是线性的样本来说,是不存在case和cont ...

  7. 探索未知种族之osg类生物---呼吸分解之更新循环一

    上节总结 前几天我们大体上介绍完成了osg的事件循环的介绍,总结一下osg的时间循环主要就是得到平台(windows)的所有消息,并遍历所有的node的eventCallback,并对他们进行处理.接 ...

  8. Xcode SVN配置

    Xcode SVN配置 编辑 ~/.subversion/config 文件  注意:假设".subversion"文件夹不存在.请执行"svn status" ...

  9. 前端使用html2canvas截图,在canvas上绘制图片及保存图片

    1.使用html2canvas 存在的问题: 不同的机型绘制位置不同的问题. 这个主要因为Html动态设置了html的dpr.(dpr可以解决屏幕显示不了1pxborder和无法显示小于12px的文字 ...

  10. Hive学习 系列博客

    原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...