html5 ajax Java接口 上传图片

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)
	 @ResponseBody
	 public 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;
	}

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

时间: 2024-10-04 17:38:09

html5 ajax Java接口 上传图片的相关文章

使用HBuilder开发移动APP:ajax调用接口数据

既然要做APP,与接口交互式少不了的,除非只是想做一个纯静态的APP.所以html5+的环境准备好后,我最先开始研究的就是如何与接口交互. 使用HBuilder新建示例教程后,里面会有一个ajax(网络请求)的列子,文件目录是examples/ajax.html.看了下这个文件的代 码,它的功能就是点击“提交”按钮后提交参数给接口,然后根据选择的返回数据格式,将一段字符串打印出来.我准备改造下这段代码,改由页面加载时调用列表 接口,并在APP里显示这段列表,毕竟这种情况应该经常会用到. 1.在l

HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条

页面技术:HTML5 + AJAX ( jQuery) 后台技术:Servlet 3.0 jQuery版本:1.9.1 后台Servlet代码这里就省略了,使用的是 AJAX请求遭遇未登录和Session失效的解决方案 这篇文章里面的后台Servlet.所以这里只看前台的JS代码. 首先HTML5用AJAX提交数据先要学习一个HTML5新增加的对象:FormData  FormData 对象可以使用append 方法进行 key - value的数据添加,与以前我们常用的json不同的就是可以异

Java 接口和抽象类区别

1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了.当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用 .面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用. 说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点. 既然面向对象设计的重点在于

java 接口的作用和好处

1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意义很疑惑.不知道接口到底是有什么作用,为什么要定义接口. 好像定义接口是提前做了个多余的工作.下面我给大家总结了4点关于JAVA中接口存在的意义: 1.重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Jav

java接口调用——webservice就是一个RPC而已

很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过socket实现rpc,以及服务的注册和动态上下线.这里先上一篇RPC的实现者一webservice,便于后面理解源码执行过程,框架就是在原理的基础上提供更加便捷的使用而已,协议就是基于TCP或UDP之上,服务者和调用者之间约定消息按照什么样的格式发送以及解析罢了.协议没什么高深莫测的. 原文和作者

java接口相关例题

java接口相关习题 interface Graphics{  //接口里面只能用抽象方法  public abstract double area();    }//设置 平面类class PlaneGraphics1{    private String shape; //形状    //构造方法,有参数    public PlaneGraphics1(String shape)    {        this.shape=shape;    }    //无参数    public P

hadoop java接口及常用api

# java接口及常用api package com.yting.hadoop.hdfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputS

JAVA接口示例

总感觉有点虚,但慢慢找到感觉了.将对象放进数组里,这就比较深入了. interface drawTest{ public void draw(); public void doAnyThing(); } class ParallelogramUserInterface extends QuadrangleUserInterface implements drawTest{ public void draw(){ System.out.println("Parallelogram.draw()&q

Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅 下面比较一下两者的语法区别:1.抽象类可以有构造方法,接口中不能有构造方法.2.抽象类中可以有普通成员变量,接口中没有普通成员变量3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法.4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclips