zoukankan      html  css  js  c++  java
  • Struts2中的异步提交(ajaxfileupload异步上传(图片)插件的使用)

    server端採用struts2来处理文件上传。

    所需环境:
    jquery.js
    ajaxfileupload.js
    struts2所依赖的jar包
    及struts2-json-plugin-2.1.8.1.jar
    编写文件上传的Action

    package com.ajaxfile.action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    @SuppressWarnings("serial")
    public class FileAction extends ActionSupport {
    
        private File file;
        private String fileFileName;
        private String fileFileContentType;
    
        private String message = "你已成功上传文件";
        
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public File getFile() {
            return file;
        }
    
        public void setFile(File file) {
            this.file = file;
        }
    
        public String getFileFileName() {
            return fileFileName;
        }
    
        public void setFileFileName(String fileFileName) {
            this.fileFileName = fileFileName;
        }
    
        public String getFileFileContentType() {
            return fileFileContentType;
        }
    
        public void setFileFileContentType(String fileFileContentType) {
            this.fileFileContentType = fileFileContentType;
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public String execute() throws Exception {
            
            String path = ServletActionContext.getRequest().getRealPath("/upload");
    
            try {
                File f = this.getFile();
                if(this.getFileFileName().endsWith(".exe")){
                    message="对不起,你上传的文件格式不同意!!!";
                    return ERROR;
                }
                FileInputStream inputStream = new FileInputStream(f);
                FileOutputStream outputStream = new FileOutputStream(path + "/"+ this.getFileFileName());
                byte[] buf = new byte[1024];
                int length = 0;
                while ((length = inputStream.read(buf)) != -1) {
                    outputStream.write(buf, 0, length);
                }
                inputStream.close();
                outputStream.flush();
            } catch (Exception e) {
                e.printStackTrace();
                message = "对不起,文件上传失败了!!!!";
            }
            return SUCCESS;
        }
    
    }
    复制代码

    struts.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
        <package name="struts2" extends="json-default">
            <action name="fileUploadAction" class="com.ajaxfile.action.FileAction">
                <result type="json" name="success">
                    <param name="contentType">
                        text/html
                    </param>
                </result>
                <result type="json" name="error">
                    <param name="contentType">
                        text/html
                    </param>
                </result>
            </action>
        </package>
    </struts>    
    复制代码

    注意结合Action观察struts.xml中result的配置。  contentType參数是一定要有的,否则浏览器总是提示将返回的JSON结果另存为文件,不会交给ajaxfileupload处理。这是因 为struts2 JSON Plugin默认的contentType为application/json。而ajaxfileupload则要求为text/html。 
    文件上传的jsp页面

    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Insert title here</title>
            <script type="text/javascript" src="js/jquery.js"></script>
            <script type="text/javascript" src="js/ajaxfileupload.js"></script>
            <script type="text/javascript">
        function ajaxFileUpload()
        {
            
            $("#loading")
            .ajaxStart(function(){
                $(this).show();
            })//開始上传文件时显示一个图片
            .ajaxComplete(function(){
                $(this).hide();
            });//文件上传完毕将图片隐藏起来
            
            $.ajaxFileUpload
            (
                {
                    url:'fileUploadAction.action',//用于文件上传的server端请求地址
                    secureuri:false,//一般设置为false
                    fileElementId:'file',//文件上传空间的id属性  <input type="file" id="file" name="file" />
                    dataType: 'json',//返回值类型 一般设置为json
                    success: function (data, status)  //server成功响应处理函数
                    {
                        alert(data.message);//从server返回的json中取出message中的数据,当中message为在struts2中action中定义的成员变量
                        
                        if(typeof(data.error) != 'undefined')
                        {
                            if(data.error != '')
                            {
                                alert(data.error);
                            }else
                            {
                                alert(data.message);
                            }
                        }
                    },
                    error: function (data, status, e)//server响应失败处理函数
                    {
                        alert(e);
                    }
                }
            )
            
            return false;
    
        }
        </script>
        </head>
        <body>
            <img src="loading.gif" id="loading" style="display: none;">
            <input type="file" id="file" name="file" />
            <br />
            <input type="button" value="上传" onclick="return ajaxFileUpload();">
        </body>
    </html>

    普通的异步提交

     $.ajax({  
              url:'delpicture.html',  
              type:'post',  
              data: 'proId='+proId+'&path='+path, 
              dataType:'json',  
              success:function (data) {  
             alert(data.message);
             window.location.reload();
              },
              error:function (data) {  
             alert(data.message);
             window.location.reload();
              } 
          });  

    这里的success和error中必须和以下配置的一样

    看我的配置,同一个class 用不同的action的name 去调用FileAction中不同的方法

    <package name="struts2" extends="json-default">
            <action name="fileUploadAction" class="com.xxx.json.FileAction">
                <result type="json" name="success">
                    <param name="contentType">
                        text/html
                    </param>
                </result>
                <result type="json" name="error">
                    <param name="contentType">
                        text/html
                    </param>
                </result>
            </action>
            
             <action name="delpicture" class="com.xxx.json.FileAction" method="delpicture">  
                <result type="json" name="success">
                    <param name="contentType">
                        text/html
                    </param>
                </result>
                <result type="json" name="error">
                    <param name="contentType">
                        text/html
                    </param>
                </result>
            </action>  
     </package>

  • 相关阅读:
    【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)
    Educational Codeforces Round 73 (Rated for Div. 2)F(线段树,扫描线)
    【PAT甲级】1042 Shuffling Machine (20 分)
    【PAT甲级】1041 Be Unique (20 分)(多重集)
    【PAT甲级】1040 Longest Symmetric String (25 分)(cin.getline(s,1007))
    【PAT甲级】1039 Course List for Student (25 分)(vector嵌套于map,段错误原因未知)
    Codeforces Round #588 (Div. 2)E(DFS,思维,__gcd,树)
    2017-3-9 SQL server 数据库
    2017-3-8 学生信息展示习题
    2017-3-5 C#基础 函数--递归
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7215773.html
Copyright © 2011-2022 走看看