Java+jsp文件上传(ajax)的方式

Posted techno-geek

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java+jsp文件上传(ajax)的方式相关的知识,希望对你有一定的参考价值。

今天在开发项目的时候碰到了一个需求,一个简单的文件上传。但是上传后需要通过回调函数做一些上传完毕的操作。发现通过<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()); //附加参数1  因为不能序列化表单,提交的时候将form的非文件域的值获取到后拼装到此处。后台获取参数的方法不变
            formFile.append("filename", fileObj.name);//附加参数2
            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();
        }
    }




}        

 

以上是关于Java+jsp文件上传(ajax)的方式的主要内容,如果未能解决你的问题,请参考以下文章

ajax上传文件,为啥后台接收的一直为空

ajax文件上传

java的servlet里如何获取jsp页面上用ajax传过来的文件?

springMVC+jsp+ajax上传文件

Ajax+formData异步文件上传

Java实现浏览器端大文件分片上传代码