今天在开发项目的时候碰到了一个需求,一个简单的文件上传。但是上传后需要通过回调函数做一些上传完毕的操作。发现通过<form><file><input submit>能做到文件上传,但是回调函数不是很好实现。 于是打算改用ajax的形式去提交。以下是实现的代码:

 

jsp页面:(css样式和标签引入属于自己定制的,与本文无关,直接去了就好);

    <%@page language="java" contentType="text/html; charset=utf-8"%>
    <%@include file="/tagDeclare.jsp"%>
    <%@include file="/headDeclare.jsp"%>
</head>
    <body>
        <form
    action="${basePath}market/contractDocumentAction!fileUpload.action"
            name="aform" method="post" id="actionForm"
            ENCTYPE="multipart/form-data">
            <div class="dialogTop">
                <table width="400" border="0" align="center" cellpadding="0"
                    cellspacing="10">
                    <tr>
                        <td>请选择文件</td>
                        <td><input name="upload" type="FILE" id="attach" size="10"></td>
                        <input type="hidden" name="conId" id="cid" value="${contractId}" />
                    </tr>
                </table>
            </div>
            <div class="dialogBottom">
                <div class="btns">
                    <input type="button" class="ldBtnGreen" value="提交" onclick="sub()" />
                    <input type="button" class="ldBtnGray" value="关闭"
                        onclick="ldDialog.close();" />
                </div>
            </div>
        </form>
    
    </body>
    </html>

javaScript:

<script type="text/javascript">
        function sub() {
            var fileObj = document.getElementById("attach").files[0]; // js 获取文件对象 ie8以下不支持files
            if (typeof (fileObj) == "undefined" || fileObj.size <= 0) {
                ldDialog.alert("请选择文件");
                return;
            }
            if(fileObj.size >(1024*1024*10))
            {
                ldDialog.alert("不能上传超过10Mb的文件!");
                return;
            }
            var formFile = new FormData();
            formFile.append("file", fileObj); //加入文件对象
            formFile.append("conIds", $("#cid").val()); //附件参数  因为不能序列化表单,提交的时候将form的非文件域的值获取到后拼装到此处。后台获取参数的方法不变
            formFile.append("filename", fileObj.name);
            var data = formFile;
            $.ajax({
                url : "${basePath}market/contractDocumentAction!fileUpload.action?" ,
                data : data,
                type : "Post",
                dataType : "json",
                cache : false,//上传文件无需缓存
                processData : false,//用于对data参数进行序列化处理 这里必须false,如果序列化处理了 那么form中的file怎无法提交。
                contentType : false, //必须
                success : function(result) {
                    ldDialog.close("上传合同文件成功");
                    return;
                }
            })
    
        }
    </script>

Struts2 Action代码

public class ContractDocumentAction extends ActionSupport {

    // 封装上传文件属性
    private File file;
    // 封装上传文件名称
    private String filename;


    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

public void fileUpload() {
    
        String filenames = sdf.format(new Date()) + "_" +contract.getSerialNum() + "_" + filename;//文件名
        String serverPath = System.getProperty("catalina.home");
        InputStream is;

        try {
            is = new FileInputStream(file);
            String fpath = serverPath + File.separator + "file";//文件保存路径 tomcat下的file文件夹
            OutputStream os = new FileOutputStream(new File(fpath, filenames));
            byte[] buffer = new byte[is.available()];//这里尽量不要使用new byte[1024]之类的写死的数组。可能会导致word文档上传之后提示文件损坏。
            int length = 0;
            while (-1 != (length = is.read(buffer, 0, buffer.length))) {
                os.write(buffer);
            }
            os.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }




}        

 

posted on 2018-06-06 16:48 techno-geek 阅读() 评论() 编辑 收藏

版权声明:本文为easyunion原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/easyunion/p/9146006.html