Struts2学习(四)利用ajax异步上传

上一篇说到怎样在struts2中进行上传下载。我们使用了struts的标签通过表单提交的方式,但大家知道表单提交会造成页面总体的刷新,这样的方式很不友好,那我们今天就来说说怎样结合ajax方式进行异步上传。

此例中须要的文件能够点击这里下载:struts2异步所需文件

文件说明:

ajaxfileupload.js : jquery不支持上传,所以使用这个ajax插件,和 jquery 中的ajax使用方法差点儿相同,从以下代码能够看到。

json2.js : 对ajax中的回调參数进行json封装,以此获得參数值。由于struts2返回的json中有网页标签就像这样:

,所以我们text方式返回,再通过此插件拿到參数

struts2-json-plugin-2.3.15.1 : 使用json,须要加入这个jar包

代码例如以下:

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.devMode" value="true" /> <!-- 开发模式 -->
    <package name="up" extends="json-default">
        <default-action-ref name="index"></default-action-ref>
        <action name="index">
            <result>/index.jsp</result>
        </action>
        <action name="upload" class="com.etoak.action.UploadAction">
            <result name="success" type="json">
                <param name="contentType">text/plain</param>
            </result>
        </action>
        <action name="delFile" class="com.etoak.action.DelFileAction">
            <result type="json"></result>
        </action>
    </package>
</struts>

UploadAction:

注意:我们使用struts中json方式返回后。全部写了get方法的属性都会被封装到json中。返回到前台,所以不须要返回的属性能够把get方法凝视掉。

package com.etoak.action;
import java.io.File;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.omg.CORBA.PUBLIC_MEMBER;

import com.etoak.util.UUIDGenerator;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
    private File myfile;
    private String myfileFileName;
    // 又一次命名后的文件全名
    private String newFileName;
    /*
     * public File getMyFile() { return myFile; }
     */
    public void setMyfile(File myfile) {
        this.myfile = myfile;

    }
    /*
     * public String getMyfileFileName() { return myfileFileName; }
     */
    public void setMyfileFileName(String myfileFileName) {
        this.myfileFileName = myfileFileName;
    }
    public String getNewFileName() {
        return newFileName;
    }
    /*
     * public void setNewFileName(String newFileName) { this.newFileName =
     * newFileName; }
     */
    @Override
    public String execute() throws Exception {
        newFileName = new UUIDGenerator().generate()
                + myfileFileName.substring(myfileFileName.lastIndexOf("."));
        String path = ServletActionContext.getServletContext().getRealPath(
                "/image")
                + "/" + newFileName;
        // newFileName自带getter方法,所以会加入到json中。返回前台
        File destFile = new File(path);
        // System.out.println(path);
        FileUtils.copyFile(myfile, destFile);
        return this.SUCCESS;
    }

}

DelFileAction:

package com.etoak.action;
import java.io.File;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.omg.CORBA.PUBLIC_MEMBER;

import com.etoak.util.UUIDGenerator;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
    private File myfile;
    private String myfileFileName;
    // 又一次命名后的文件全名
    private String newFileName;
    /*
     * public File getMyFile() { return myFile; }
     */
    public void setMyfile(File myfile) {
        this.myfile = myfile;

    }
    /*
     * public String getMyfileFileName() { return myfileFileName; }
     */
    public void setMyfileFileName(String myfileFileName) {
        this.myfileFileName = myfileFileName;
    }
    public String getNewFileName() {
        return newFileName;
    }
    /*
     * public void setNewFileName(String newFileName) { this.newFileName =
     * newFileName; }
     */
    @Override
    public String execute() throws Exception {
        newFileName = new UUIDGenerator().generate()
                + myfileFileName.substring(myfileFileName.lastIndexOf("."));
        String path = ServletActionContext.getServletContext().getRealPath(
                "/image")
                + "/" + newFileName;
        // newFileName自带getter方法。所以会加入到json中,返回前台
        File destFile = new File(path);
        // System.out.println(path);
        FileUtils.copyFile(myfile, destFile);
        return this.SUCCESS;
    }

}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>jquery异步上传</title>
  </head>
  <body>
    <input type="file" name="myfile" id="myfile" />
    <input type="button" value="上传" id="upload" />
    <div id="files" ></div>
    <script type="text/javascript" src="script/jquery-1.10.2.js"></script>
    <script type="text/javascript" src="script/json2.js"></script>
    <script type="text/javascript" src="script/ajaxfileupload.js"></script><!-- jquery不支持上传 -->
        <script type="text/javascript">
            $(document).ready(function(){
                //上传文件。点击上传后
                $("#upload").click(function(){
                    var $myfile = $("#myfile").val();
                    //检查用户是否上传了文件
                    if($myfile!=""){
                        //開始调用ajax异步请求
                        //此方法由ajaxfileupload.js提供
                        $.ajaxFileUpload({
                            url:"upload.action",
                            type:"post",
                            //提交上传文件的控件
                            fileElementId:"myfile",
                            //是否支持跨域传输
                            //默认不支持
                            secureuri:false,
                            //由于不能直接解析json,所以必须依照字符串
                            dataType:"text",
                            success:function(data){
                                alert(data);
                                //将json数据从标签中取出
                                var text = $(data).html();
                                //转换为js对象
                                var obj = JSON.parse(text);
                                //获得文件信息
                                var filename = obj.newFileName;
                                $("#files").append("<img name=‘"+filename+"‘ src=‘image/"+filename+"‘ style=‘width:200px;height:100px‘ />");
                                //解除img元素上全部绑定的事件
                                $("img").unbind();
                                $("img").click(function(){
                                    //拿取图片name属性
                                    var fn = $(this).attr("name");
                                    if(confirm("确定删除?")){
                                        $.ajax({
                                            url:"delFile.action",
                                            type:"post",
                                            data:"filename="+fn,
                                            dataType:"json",
                                            success:function(data){
                                                if(data.flag){
                                                    alert("删除成功");
                                                    //拿到32位随机码
                                                    var uuid = fn.substring(0,fn.indexOf("."));
                                                    //拿取img元素name属性开头符合uuid的元素
                                                    $("img[name^="+uuid+"]").remove();
                                                }
                                            }

                                        });
                                    }

                                });
                            },
                            error:function(err){
                                alert(err.status);
                            }
                        });
                    }
                });

            });
        </script>
  </body>
</html>

页面效果例如以下:

时间: 2024-10-13 11:14:30

Struts2学习(四)利用ajax异步上传的相关文章

解决ajax异步上传文件的问题

HTML: <form id="avater" name="formlist"> {{ csrf_field() }} <ul class="list-group container" style="width:50%"> <li class="list-group-item list" style="border-radius: 5px"> <

ajax 异步上传视频带进度条并提取缩略图

最近在做一个集富媒体功能于一身的项目.需要上传视频.这里我希望做成异步上传,并且有进度条,响应有状态码,视频连接,缩略图. 1 { 2 "thumbnail": "/slsxpt//upload/thumbnail/6f05d4985598160c548e6e8f537247c8.jpg", 3 "success": true, 4 "link": "/slsxpt//upload/video/6f05d498559

struts2学习笔记之十:文件上传

Struts2的上传 1.Struts2默认采用了apache commons-fileupload 2.Struts2支持三种类型的上传组件 3.需要引入commons-fileupload相关依赖包 * commons-io-1.3.2.jar * commons-fileupload-1.2.1.jar 4.表单中需要采用POST提交方式,编码类型需要使用:multipart/form-data 5.Struts2的Action 取得文件名称->>规则:输入域的名称+固定字符串FileN

[原创]java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Struts2学习(八)—文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的实现进行一下讲解,这里 我们使用的struts2 web项目所导入的jar包中的**commons-fileupload-1.3.1.jar commons-io-

15. 利用ajax jquery 上传文件

通过jQuery Ajax使用FormData对象上传文件 字数664 阅读26857 评论18 喜欢18 FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用FormData对象 有详尽的FormData对象使用说明. 但上传文件部分只有底层的XMLHttpRequest对象发送上传请求,那么怎么通过jQuery的Ajax上传呢? 本文将介绍通过jQuery使用F

struts2学习笔记之十七(上传文件)

文件上传 传统的文件上传 (1)需要将form设置为multipart/form-data:此时会将整个表单以二进制流的方式提交:接下来就无法将通过request.getParameter()来获取请求参数. (2)需要启用一个文件上传组件(SmartUpload,Common-FileUpload等) (3)Servlet通过文件上传组件来获取请求参数,获取上传文件. 得到上传文件之后,以IO流的方式把文件写入磁盘 Servlet3.0之后的文件上传 只需要增加一个@MultipartConf

支持多文件上传,预览,拖拽,基于bootstra的上传插件fileinput 的ajax异步上传

首先需要导入一些js和css文件 <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet"> <link type="text/css" rel="stylesheet" href="__PUBLIC__/CSS/fileinput.css" /> <script type="text/javascript&

Ajax异步上传文件

需要引用js jquery.form 前端代码 <form action="/Save" id="mainForm" method="post" enctype="multipart/form-data"> <div class="portlet-body form-horizontal form-bordered form-row-stripped"> <div class=