html5 ajax Java接口 上传图片

来源:互联网 发布:编程计算xyz yzz 编辑:程序博客网 时间:2024/05/18 21:12

原文地址:http://www.cnblogs.com/WarBlog/p/4838255.html

html5图片上传【文件上传】
在网上找了很多资料,主要也就2种

1.from表单提交的方式

<form action="pushUserIcon" method="post" enctype="multipart/form-data">     <table>         <tr>             <td width="50" align=left>图片:</td>             <td><input type="file" name="file"/></td>                    </tr>         <tr>             <td width="50" align="left">用户id:</td>             <td><input type="text" name="userId"/></td>                    </tr>        <tr>            <td><input type="submit"> </td>        </tr>    </table> </form>

注意:  enctype="multipart/form-data" 必须要填

1.1.Java页面直接提交:

  @RequestMapping(value="/pushUserIcon",method=RequestMethod.POST)@ResponseBodypublic String pushUserIcon(HttpServletRequest request, HttpServletResponse response) throws IOException,BaseException {      String result = null;    String userId = request.getParameter("userId");    try{        //转型为MultipartHttpRequest(重点的所在)         MultipartHttpServletRequest multipartRequest  =  (MultipartHttpServletRequest) request;         //获得第1张图片(根据前台的name名称得到上传的文件)          MultipartFile file  =  multipartRequest.getFile("file");        result = uploadImageServic.uploadFile(file, request, userId);                  System.out.println("result:" + result);         response.setContentType("text/html;charset=utf8");         response.getWriter().write("result:" + result);          }catch(Exception e){        BaseException baseException = new BaseException(e);        baseException.setErrorMsg("Upload API Exception");        throw baseException;    }          return  null; }    

1.2.原生js 和jQuery的网上有很多,这里就不多说了。
1.2.1. fromData创建的两种方式

var formData = new FormData($("#myForm")[0]);//用form 表单直接 构造formData 对象; 就不需要下面的append 方法来为表单进行赋值了。                       //var formData = new FormData();//构造空对象,下面用append 方法赋值。 //       formData.append("policy", ""); //       formData.append("signature", ""); //       formData.append("file", $("#file_upload")[0].files[0]);
2.不用from表单提交:

<table style="border: 1px solid black; width: 100%">     <tr>            <td width="50" align=left>图片:</td>             <td><input type="file"  id="imageFile" name="img" multiple="multiple"/></td>            <td>                <input type="button" value="调用" onclick="pushImg()" />            </td>        </tr>       </table>

HTML就这些,我想大家应该都能看懂,下面就要说说这2种提交方式,Ajax是如何编码?【from表单提交方式也可以使用js或者直接提交页面刷新】

Ajax编码也有2种:
1.原生js

function sub(){    var file = document.getElementById("imageFile");    var files = file.files;    for(var i = 0 ; i < files.length;i++)    {        uploadFile(files[i]);    }} var xhr = null;function uploadFile(file) {    xhr = new XMLHttpRequest();   /*  xhr.addEventListener("error", uploadFailed, false);    xhr.addEventListener("abort", uploadCanceled, false); */    xhr.open("post", "upload/", true); //访问控制器是upload,后面必须加'/'否则会报错"org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.Mult...",但是如果是多级的URL【例如XX/XXX/00/upload/0】又没问题了.    var fd = new FormData();    fd.append("userID", "1");    fd.append("errDeviceType", "001");    fd.append("errDeviceID", "11761b4a-57bf-11e5-aee9-005056ad65af");    fd.append("errType", "001");    fd.append("errContent", "XXXXXX");    fd.append("errPic", file);    xhr.send(fd);    xhr.onreadystatechange = cb;}function cb(){    if(xhr.status == 200)    {        var b = xhr.responseText;        if(b == "success"){            alert("上传成功!");        }else{            alert("上传失败!");        }    }}

2.jquery

function pushImg(obj) {    debugger;    var url = "upload/"; //访问控制器是upload,后面必须加'/'否则会报错"org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.Mult...",但是如果是多级的URL【例如XX/XXX/00/upload/0】又没问题了.    var param = $("#errorParameter").val();     var files = $("#imageFile").get(0).files[0]; //获取file控件中的内容     var fd = new FormData();    fd.append("userID", "1");    fd.append("errDeviceType", "001");    fd.append("errDeviceID", "11761b4a-57bf-11e5-aee9-005056ad65af");    fd.append("errType", "001");    fd.append("errContent", "XXXXXX");    fd.append("errPic", files);    $.ajax({        type: "POST",        contentType:false, //必须false才会避开jQuery对 formdata 的默认处理 , XMLHttpRequest会对 formdata 进行正确的处理        processData: false, //必须false才会自动加上正确的Content-Type         url: url,        data: fd,        success: function (msg) {            debugger;            var jsonString = JSON.stringify(msg);            $("#txtTd").text(jsonString)            alert(jsonString);        },        error: function (msg) {            debugger;            alert("error");        }    });}

现在前端的就应该差不多了,现在就是接口了,我的参数和访问路径都好了,现在就差接口服务了:
spring mvc框架:

@RequestMapping(value = { "upload" })        public void pushErrorData(HttpServletRequest request,                    HttpServletResponse response) throws BaseException {            String userID=request.getParameter("userID");                                              // 转型为MultipartHttpRequest(重点的所在)这个就是上面ajax中提到如果直接访问此接口而不加"/",此转型就会报错            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;                             //MultipartFile file = multipartRequest.getFiles("errPic");//获取文件集合  对应  jquery $("#imageFile").get(0).files            // 获得第1张图片(根据前台的name名称得到上传的文件)            MultipartFile file = multipartRequest.getFile("errPic"); //对应  jquery $("#imageFile").get(0).files[index]            Map<String, Object> map = new HashMap<String, Object>();            if (null!=file && !file.isEmpty()) {                try {                    map = Common.uploadFile(file);                                         } catch (IOException e) {                    BaseException baseException = new BaseException(e);                    //baseException.setErrorMsg(imgErrorMsg);                    throw baseException;                }            }        } /**     * 图片上传     *     * @param file     * @return     * @throws IOException     * @throws BaseException     */    public static Map<String, Object> uploadFile(MultipartFile file)            throws IOException, BaseException {        String fail = ConfigBundleHelper.getValue("busConfig", "fail");//上传失败状态        String success = ConfigBundleHelper.getValue("busConfig", "success");//上传成功状态        String errorMsg = ConfigBundleHelper.getValue("busConfig","imgErrorMsg");//上传错误信息        String filePath = ConfigBundleHelper.getValue("busConfig", "filePath");//上传路径,本来是相对路径,但是在发布后路径会创建在tomcat的bin目录下,所以接口上传的路径是一个难题,我用的是绝对路径,等到发布到Linux环境中,通过配置文件修改路径为Linux中的资源地址【防止工程删除而资源文件不会丢失】,然后重新发布工程时再通过Linux的命令把我们需要的资源文件导入到我们发布的工程项目中。        String size = ConfigBundleHelper.getValue("busConfig", "fileSize");        String interfaceService = ConfigBundleHelper.getValue("busConfig",                "interfaceService");                 long maxFileSize = (Integer.valueOf(size)) * 1024 * 1024;        String suffix = file.getOriginalFilename().substring(                file.getOriginalFilename().lastIndexOf("."));        long fileSize = file.getSize();        Map<String, Object> map = new HashMap<String, Object>();        if (suffix.equals(".png") || suffix.equals(".jpg")) {            if (fileSize < maxFileSize) {                // System.out.println("fileSize"+fileSize);                String fileName = file.getOriginalFilename();                fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");                File tempFile = new File(filePath, new Date().getTime()                        + fileName);                 try {                    if (!tempFile.getParentFile().exists()) {                        tempFile.getParentFile().mkdirs();//如果是多级文件使用mkdirs();如果就一层级的话,可以使用mkdir()                    }                    if (!tempFile.exists()) {                         tempFile.createNewFile();                    }                    file.transferTo(tempFile);                } catch (IllegalStateException e) {                    BaseException baseException = new BaseException(e);                    baseException.setErrorMsg(errorMsg);                    throw baseException;                }                 map.put("SUCESS", success);                map.put("data",interfaceService + filePath + new Date().getTime() + tempFile.getName());             } else {                map.put("SUCESS", fail);                map.put("data", "Image too big");            }         } else {            map.put("SUCESS", fail);            map.put("data", "Image format error");        }        return map;    }

这是我在工作中所遇到到问题,分享给大家,希望大家不会在这个问题上花费大量的时间。谢谢

0 0
原创粉丝点击