HAP框架+spring MVC下上传文件

23 篇文章 0 订阅

1.问题

之前写过上传文件了,利用$.ajaxUpload()方法,但是发现在HAP框架下,根本不吃这一套,出现了一个框架内部错误,应该是权限或者某些字段没有被赋值报错,反正框架的缺点在这里我是深深的体会到了。

2.解决方法

查了很多资料,发现$.ajax()是不能直接上传文件的,需要使用 FormData()将文件序列化,变成二进制在上传。

前端js

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <form action="/exportFile1" id="uploads_file" method="post"  enctype="multipart/form-data">
        <input   id="excelFile" type="file" name="excelFile"
                style="border:none;padding-bottom:10px;">
       <!-- <input   id="name" type="text" name="name"
                 style="border:none;padding-bottom:10px;">
        <input   id="pas" type="text" name="pas"
                 style="border:none;padding-bottom:10px;">-->
    </form>
    <span id="fileName">请选择文件!</span>

<input type="submit" id="btn_export" value="上传">
<script>

    $("#btn_export").click(function () {
        var name = $("#excelFile").val();
        var f = name.endsWith(".xlsx") || name.endsWith(".xls") || name.endsWith(".csv");
        console.log(f);

        if(!f){
            alert('文件格式不正确,应该为Excel表格')

        }else {

            var formData = new FormData($("#uploads_file")[0]);//将form表单序列化
            //var formData = $("#uploads_file").serialize();
            $.ajax({
                url: "/exportFile1",
                type: "POST",
                data: formData, //
//                dataType:"json",
                async: false,
                cache: false,
                contentType: false,
                processData: false,
                //contentType: "application/json",
                success: function (result) {
                    console.log(result);
                }
            });
        }
    });
</script>
</body>
</html>

后台处理

@RequestMapping(value = "/exportFile1",method = RequestMethod.POST)
    @ResponseBody                                  //final CommonsMultipartFile  MultipartFile file
    public String exportFile1(HttpServletRequest request, HttpServletResponse response
    ){
        System.out.println("来啊1");
       // MultipartFile file = request.getParameter("excelFile");
        FileItemFactory fileItemFactory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
        try {
            List<?> items = upload.parseRequest(request);
            Iterator iter = items.iterator();
            while(iter.hasNext()){
                FileItem item = (FileItem) iter.next();
                if (item.isFormField()) {
                    //如果是普通表单字段
                    String name = item.getFieldName();
                    String value = item.getString();
                } else {
                    String fieldName = item.getFieldName();
                    String fileName = item.getName();
                    String contentType = item.getContentType();
                    boolean isInMemory = item.isInMemory();
                    long sizeInBytes = item.getSize();                    System.out.println("ServletFileUpload 的文件:"+fileName);                
                    try {
                        item.write(uploadedFile);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        return "scuess";
    }

到了这里很多人可能会说,为什么不在方法参数将文件按照文件名映射过来,类似于@RequestParam(value=”excelFile”) MultipartFile excelFile 这样。其实我遇到的就是这个问题。前端数据经过FormData()方法后已经是(key,value)的形式了,可以根据name的值来获取值了,一般的mvc都可以映射到后台,但是hap框架好像不行,我试了很多次了,最后实在不行,就用了现在这个方法,硬硬是从request里面读出来。这个方法有点粗暴,但是我喜欢。

注意:调试代码的时候绝对绝对不能用搜狗浏览器,不是我黑它,我它不支持FormData()这个方法,害我以为是jQuery的版本问题,我已经被坑了。用主流的,谷歌火狐等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值