用ajax上传图片及java后台接收问题

用ajax往后台上传图片时,

1. form表单标签里要加属性:enctype="multipart/form-data";

<div class="logo-div">
  <label class="col-md-1 control-label">图片</label>
  <div class="col-md-2">
    <input type="file" id="logos" name="logos">
  </div>
  <label class="col-md-1 control-label">预览</label>
  <div class="col-md-2">
    <img id="upload_images" src="" width="197px;" height="214px;">
  </div>
</div>

$('#logos').change(function () {
  previewImgEvents();
});

function previewImgEvents() {
// 根据这个 <input> 获取文件的 HTML5 js 对象
var files = event.target.files, file;
if (files && files.length > 0) {
// 获取目前上传的文件
file = files[0];
// 来在控制台看看到底这个对象是什么
// 那么我们可以做一下诸如文件大小校验的动作
if (file.size > 1024 * 1024) {
alert('图片大小不能超过 1MB!');
return false;
}
// !!!!!!
// 下面是关键的关键,通过这个 file 对象生成一个可用的图像 URL
// 获取 window 的 URL 工具
var URL = window.URL || window.webkitURL;
// 通过 file 生成目标 url
var imgURL = URL.createObjectURL(file);
// 用这个 URL 产生一个 <img> 将其显示出来
$('#upload_images').attr('src', imgURL);
// 使用下面这句可以在内存中释放对此 url 的伺服,跑了之后那个 URL 就无效了
// URL.revokeObjectURL(imgURL);
}
}

2. ajax请求体里,

------------------------------------------

用formData装上传的图片时的方式:

var formData = new FormData();
var logo_file = document.getElementById("logos");
var logoFileObj = logo_file.files[0];

formData.append("logos", logoFileObj);

------------------------------------------

$.ajax({
  cache: false,
  type: 'post',
  url: SERVER_URL + "/xxx" +( "?APIType=3&Authorization=" + token),
  data:xxx,
  processData: false,
  contentType: false,
  success: function (data) {...

-----------------------------------------------------------------------------------------

data中可传入的形式有:

1)

var form = new FormData(document.getElementById("formId"));
...
data: form,

2)

var formData = new FormData();
formData.append("key",value);
...
data: formData,

-----------------------------------------------------------------------------------------

3. java后台接收时:(form和formData一样)

@Transactional
@RequestMapping(value = "", method = RequestMethod.POST)
public int addHospital(Entity entity, MultipartFile logos) {

if (null != logos) {
if (logos.getSize() > 0) {
String imageSrc = uploadFile(logos, xxx.getxxx().toString());
if (!Misc.isNull(imageSrc)) {
xxx.setLogo(imageSrc.substring(imageSrc.lastIndexOf("/") + 1));
}
}
} else {
xxx.setLogo("default.jpg");
}

}

-----------------------------------------------------------------------------------------

如果formData传入时,entity里的一个属性本身时一个实体,则单独把这个实体的属性值在js里封装起来,
整体放到formData里,
var aaa = {
key: value,
key: value,
key: value,
...
};
var ht = JSON.stringify(aaa); -- 把aaa整体转换成json。
formData.append("xxxs", ht); -- xxxs是在后台实体里新增的一个临时字段:
@Transient
private String xxxs;

在java后台接收时的处理:

String xxxs = qqq.getXxxs();
JSONObject jsonObject = JSON.parseObject(xxxs);
qqq.setXxx(JSONObject.toJavaObject(jsonObject, xxx.class)); -- xxx是实体里的一个本身为实体的属性字段。
(这样就把单独的这部分数据整体set到xxx里了)
(用的是:com.alibaba.fastjson下的类工具)。

 

posted @ 2018-05-04 16:55  IT知更鸟  阅读(9456)  评论(0编辑  收藏  举报