美文网首页HTML5 Canvas我爱编程H5技术栈
扣丁学堂HTML5视频教程之微信小程序图片上传源码

扣丁学堂HTML5视频教程之微信小程序图片上传源码

作者: 994d14631d16 | 来源:发表于2018-05-29 10:09 被阅读16次

  今天扣丁学堂小编给大家详细介绍一下关于HTML5视频教程微信小程序上传图片功能及后端代码,几乎每个程序都需要用到图片,在小程序中我们可以通过image组件显示图片,当然小程序也是可以上传图片的,微信小程序文档也写的很清楚。下面我们来一起看一下吧。

​  官方示例代码

  wx.chooseImage({

  count:1,//默认9

  sizeType:['original','compressed'],//可以指定是原图还是压缩图,默认二者都有

  sourceType:['album','camera'],//可以指定来源是相册还是相机,默认二者都有

  success:function(res){

  //返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片

  vartempFilePaths=res.tempFilePaths

  }

  })

  图片最多可以选择9张,也可以通过拍摄照片实现,当选择完图片之后会获取到图片路径,这个路径在本次启动期间有效。

  如果需要保存就需要用wx.saveFile(OBJECT)

  通过wx.uploadFile(OBJECT)可以将本地资源文件上传到服务器。

  原理就是客户端发起一个HTTPSPOST请求,其中content-type为multipart/form-data。

  官方示例代码

  wx.chooseImage({

  success:function(res){

  vartempFilePaths=res.tempFilePaths

  wx.uploadFile({

  url:'http://example.weixin.qq.com/upload',//仅为示例,非真实的接口地址

  filePath:tempFilePaths[0],

  name:'file',

  formData:{

  'user':'test'

  },

  success:function(res){

  vardata=res.data

  //dosomething

  }

  })

  }

  })

  示例代码

  看完了官方文档,写一个上传图片就没有那么麻烦了,下面是真实场景的代码

  importconstantfrom'../../common/constant';

  Page({

  data:{

  src:"../../image/photo.png",//绑定image组件的src

  //略...

  },

  onLoad:function(options){

  //略...

  },

  uploadPhoto(){

  varthat=this;

  wx.chooseImage({

  count:1,//默认9

  sizeType:['compressed'],//可以指定是原图还是压缩图,默认二者都有

  sourceType:['album','camera'],//可以指定来源是相册还是相机,默认二者都有

  success:function(res){

  //返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片

  vartempFilePaths=res.tempFilePaths;

  upload(that,tempFilePaths);

  }

  })

  }

  })

  functionupload(page,path){

  wx.showToast({

  icon:"loading",

  title:"正在上传"

  }),

  wx.uploadFile({

  url:constant.SERVER_URL+"/FileUploadServlet",

  filePath:path[0],

  name:'file',

  header:{"Content-Type":"multipart/form-data"},

  formData:{

  //和服务器约定的token,一般也可以放在header中

  'session_token':wx.getStorageSync('session_token')

  },

  success:function(res){

  console.log(res);

  if(res.statusCode!=200){

  wx.showModal({

  title:'提示',

  content:'上传失败',

  showCancel:false

  })

  return;

  }

  vardata=res.data

  page.setData({//上传成功修改显示头像

  src:path[0]

  })

  },

  fail:function(e){

  console.log(e);

  wx.showModal({

  title:'提示',

  content:'上传失败',

  showCancel:false

  })

  },

  complete:function(){

  wx.hideToast();//隐藏Toast

  }

  })

  }

  后端代码

  后端是用java写的,一开始的时候,后端开始用了一些框架接收上传的图片,出现了各种问题,后来使用了纯粹的Servlet就没有了问题,把代码贴出来省的以后麻烦了。

  注意:代码使用了公司内部的框架,建议修改后再使用

  publicclassFileUploadServletextendsHttpServlet{

  privatestaticfinallongserialVersionUID=1L;

  privatestaticLoggerlogger=LoggerFactory.getLogger(FileUploadServlet.class);

  publicFileUploadServlet(){

  super();

  }

  protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

  JsonMessagemessage=newJsonMessage();

  EOSResponseeosResponse=null;

  StringsessionToken=null;

  FileItemfile=null;

  InputStreamin=null;

  ByteArrayOutputStreamswapStream1=null;

  try{

  request.setCharacterEncoding("UTF-8");

  //1、创建一个DiskFileItemFactory工厂

  DiskFileItemFactoryfactory=newDiskFileItemFactory();

  //2、创建一个文件上传解析器

  ServletFileUploadupload=newServletFileUpload(factory);

  //解决上传文件名的中文乱码

  upload.setHeaderEncoding("UTF-8");

  //1.得到FileItem的集合items

  Listitems=upload.parseRequest(request);

  logger.info("items:{}",items.size());

  //2.遍历items:

  for(FileItemitem:items){

  Stringname=item.getFieldName();

  logger.info("fieldName:{}",name);

  //若是一个一般的表单域,打印信息

  if(item.isFormField()){

  Stringvalue=item.getString("utf-8");

  if("session_token".equals(name)){

  sessionToken=value;

  }

  }else{

  if("file".equals(name)){

  file=item;

  }

  }

  }

  //session校验

  if(StringUtils.isEmpty(sessionToken)){

  message.setStatus(StatusCodeConstant.SESSION_TOKEN_TIME_OUT);

  message.setErrorMsg(StatusCodeConstant.SESSION_TOKEN_TIME_OUT_MSG);

  }

  StringuserId=RedisUtils.hget(sessionToken,"userId");

  logger.info("userId:{}",userId);

  if(StringUtils.isEmpty(userId)){

  message.setStatus(StatusCodeConstant.SESSION_TOKEN_TIME_OUT);

  message.setErrorMsg(StatusCodeConstant.SESSION_TOKEN_TIME_OUT_MSG);

  }

  //上传文件

  if(file==null){

  }else{

  swapStream1=newByteArrayOutputStream();

  in=file.getInputStream();

  byte[]buff=newbyte[1024];

  intrc=0;

  while((rc=in.read(buff))>0){

  swapStream1.write(buff,0,rc);

  }

  Usrusr=newUsr();

  usr.setObjectId(Integer.parseInt(userId));

  finalbyte[]bytes=swapStream1.toByteArray();

  eosResponse=ServerProxy.getSharedInstance().saveHeadPortrait(usr,newRequestOperation(){

  @Override

  publicvoidaddValueToRequest(EOSRequestrequest){

  request.addMedia("head_icon_media",newEOSMediaData(EOSMediaData.MEDIA_TYPE_IMAGE_JPEG,bytes));

  }

  });

  //请求成功的场合

  if(eosResponse.getCode()==0){

  message.setStatus(ConstantUnit.SUCCESS);

  }else{

  message.setStatus(String.valueOf(eosResponse.getCode()));

  }

  }

  }catch(Exceptione){

  e.printStackTrace();

  }finally{

  try{

  if(swapStream1!=null){

  swapStream1.close();

  }

  }catch(IOExceptione){

  e.printStackTrace();

  }

  try{

  if(in!=null){

  in.close();

  }

  }catch(IOExceptione){

  e.printStackTrace();

  }

  }

  PrintWriterout=response.getWriter();

  out.write(JSONObject.toJSONString(message));

  }

  protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

  doGet(request,response);

  }

  }

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多关注扣丁学堂。

相关文章

网友评论

    本文标题:扣丁学堂HTML5视频教程之微信小程序图片上传源码

    本文链接:https://www.haomeiwen.com/subject/ikyojftx.html