微信小程序上传图片功能(附后端代码)


Posted in Javascript onJune 19, 2020

几乎每个程序都需要用到图片,在小程序中我们可以通过image组件显示图片。

当然小程序也是可以上传图片的,微信小程序文档也写的很清楚。

上传图片

首先选择图片

通过wx.chooseImage(OBJECT)实现

微信小程序上传图片功能(附后端代码)

官方示例代码

wx.chooseImage({
 count: 1, // 默认9
 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
 success: function (res) {
 // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
 var tempFilePaths = res.tempFilePaths
 }
})

图片最多可以选择9张, 也可以通过拍摄照片实现,当选择完图片之后会获取到图片路径, 这个路径在本次启动期间有效。
如果需要保存就需要用wx.saveFile(OBJECT)

上传图片

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

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

微信小程序上传图片功能(附后端代码)

官方示例代码

wx.chooseImage({
 success: function(res) {
 var tempFilePaths = res.tempFilePaths
 wx.uploadFile({
 url: 'http://example.weixin.qq.com/upload', //仅为示例,非真实的接口地址
 filePath: tempFilePaths[0],
 name: 'file',
 formData:{
 'user': 'test'
 },
 success: function(res){
 var data = res.data
 //do something
 }
 })
 }
})

示例代码

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

import constant from '../../common/constant';
Page({
 data: {
 src: "../../image/photo.png", //绑定image组件的src
 //略...
 },
 onLoad: function (options) {
 //略... 
 },
 uploadPhoto() {
 var that = this; 
 wx.chooseImage({
 count: 1, // 默认9
 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
 success: function (res) {
 // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
 var tempFilePaths = res.tempFilePaths;
 upload(that, tempFilePaths);
 }
 })
 }
})

function upload(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;
 }
 var data = 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就没有了问题, 把代码贴出来省的以后麻烦了。

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

public class FileUploadServlet extends HttpServlet {

 private static final long serialVersionUID = 1L;
 private static Logger logger = LoggerFactory.getLogger(FileUploadServlet.class);

 public FileUploadServlet() {
 super();
 }

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 JsonMessage<Object> message = new JsonMessage<Object>();
 EOSResponse eosResponse = null;
 String sessionToken = null;
 FileItem file = null;
 InputStream in = null;
 ByteArrayOutputStream swapStream1 = null;
 try {
  request.setCharacterEncoding("UTF-8"); 

  //1、创建一个DiskFileItemFactory工厂 
  DiskFileItemFactory factory = new DiskFileItemFactory(); 
  //2、创建一个文件上传解析器 
  ServletFileUpload upload = new ServletFileUpload(factory);

  //解决上传文件名的中文乱码 
  upload.setHeaderEncoding("UTF-8"); 
  // 1. 得到 FileItem 的集合 items 
  List<FileItem> items = upload.parseRequest(request);
  logger.info("items:{}", items.size());
  // 2. 遍历 items: 
  for (FileItem item : items) { 
  String name = item.getFieldName(); 
  logger.info("fieldName:{}", name);
  // 若是一个一般的表单域, 打印信息 
  if (item.isFormField()) { 
   String value = 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);
  }
  String userId = 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 = new ByteArrayOutputStream();

  in = file.getInputStream();
  byte[] buff = new byte[1024];
  int rc = 0;
  while ((rc = in.read(buff)) > 0) {
   swapStream1.write(buff, 0, rc);
  }

  Usr usr = new Usr();
  usr.setObjectId(Integer.parseInt(userId));

  final byte[] bytes = swapStream1.toByteArray();

  eosResponse= ServerProxy.getSharedInstance().saveHeadPortrait(usr, new RequestOperation() {

   @Override
   public void addValueToRequest(EOSRequest request) {
   request.addMedia("head_icon_media", new EOSMediaData(EOSMediaData.MEDIA_TYPE_IMAGE_JPEG, bytes));
   }
  });

  // 请求成功的场合
  if (eosResponse.getCode() == 0) {
   message.setStatus(ConstantUnit.SUCCESS);
  } else {
   message.setStatus(String.valueOf(eosResponse.getCode()));
  }
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally{
  try {
  if(swapStream1 != null){
   swapStream1.close();
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
  try {
  if(in != null){
   in.close();
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
 }
 PrintWriter out = response.getWriter(); 
 out.write(JSONObject.toJSONString(message)); 
 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doGet(request, response);
 }

}

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
九种js弹出对话框的方法总结
Mar 12 Javascript
js实现幻灯片播放图片示例代码
Nov 07 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
Apr 22 Javascript
JavaScript中的console.group()函数详细介绍
Dec 29 Javascript
JavaScript错误处理
Feb 03 Javascript
jQuery实现html元素拖拽
Jul 21 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
jQuery 特性操作详解及实例代码
Sep 29 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
JavaScript中使用参数个数实现重载功能
Sep 01 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
Dec 07 Javascript
讲解vue-router之什么是编程式路由
May 28 #Javascript
讲解vue-router之什么是嵌套路由
May 28 #Javascript
微信小程序上传图片实例
May 28 #Javascript
讲解vue-router之什么是动态路由
May 28 #Javascript
.vue文件 加scoped 样式不起作用的解决方法
May 28 #Javascript
微信小程序实现上传图片功能
May 28 #Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 #Javascript
You might like
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
前端微信支付js代码
2016/07/25 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
Django中使用Celery的方法示例
2018/11/29 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
Python3 集合set入门基础
2020/02/10 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
python爬虫基础知识点整理
2020/06/02 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
新闻专业应届生求职信
2013/10/31 职场文书
学生安全承诺书
2014/05/22 职场文书
出售房屋协议书范本
2014/10/06 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
Golang流模式之grpc的四种数据流
2022/04/13 Golang
python开发制作好看的时钟效果
2022/05/02 Python