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


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 相关文章推荐
jquery 添加节点的几种方法介绍
Sep 04 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
jquery模拟多级复选框效果的简单实例
Jun 08 Javascript
Javascript随机标签云代码实例
Jun 21 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
Jan 24 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
vue.js移动数组位置,同时更新视图的方法
Mar 08 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 jQuery
解决koa2 ctx.render is not a function报错问题
Aug 07 Javascript
vue-cli 目录结构详细讲解总结
Jan 15 Javascript
node.js中module模块的功能理解与用法实例分析
Feb 14 Javascript
React Ant Design树形表格的复杂增删改操作
Nov 02 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
php面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
js prototype截取字符串函数
2010/04/01 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
vue-router 起步步骤详解
2019/03/26 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
带你了解python装饰器
2017/06/15 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
30年同学聚会感言
2014/01/30 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
股东授权委托书
2014/10/15 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS