闲言少叙直入正题

前端代码在网上一搜一大堆,且搜出来的结果基本上是正确的,没啥好说的,我连代码都不想贴(如果有时间的话明天整理下贴在文章结尾,没时间的话就不贴了)。但是,但是,但是,靠谱的,不用改动就能够正常运行的Java服务端接收代码,几乎没有,没错,是几乎,没有。因为我基本上把网上能搜出来的代码都试了。试到第三个的时候,有点靠谱了,遗憾的是有bug。所幸改了bug后,代码正常运行无误。所以现在将服务端代码贴在这里,造福后人。

import com.alibaba.fastjson.JSON;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.List;/*** Created by majl on 2017/9/1.*/
@Controller
@RequestMapping("/upload")
public class UploadController {private static final Logger logger = LoggerFactory.getLogger(UploadController.class);@RequestMapping("/picture")public void uploadPicture(HttpServletRequest request, HttpServletResponse response) throws Exception {//获取文件需要上传到的路径String path = request.getRealPath("/upload") + "/";File dir = new File(path);if (!dir.exists()) {dir.mkdir();}logger.debug("path=" + path);request.setCharacterEncoding("utf-8");  //设置编码//获得磁盘文件条目工厂DiskFileItemFactory factory = new DiskFileItemFactory();//如果没以下两行设置的话,上传大的文件会占用很多内存,//设置暂时存放的存储室,这个存储室可以和最终存储文件的目录不同/*** 原理: 它是先存到暂时存储室,然后再真正写到对应目录的硬盘上,* 按理来说当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的* 然后再将其真正写到对应目录的硬盘上*/factory.setRepository(dir);//设置缓存的大小,当上传文件的容量超过该缓存时,直接放到暂时存储室factory.setSizeThreshold(1024 * 1024);//高水平的API文件上传处理ServletFileUpload upload = new ServletFileUpload(factory);try {List<FileItem> list = upload.parseRequest(request);FileItem picture = null;for (FileItem item : list) {//获取表单的属性名字String name = item.getFieldName();//如果获取的表单信息是普通的 文本 信息if (item.isFormField()) {//获取用户具体输入的字符串String value = item.getString();request.setAttribute(name, value);logger.debug("name=" + name + ",value=" + value);} else {picture = item;}}//自定义上传图片的名字为userId.jpgString fileName = request.getAttribute("userId") + ".jpg";String destPath = path + fileName;logger.debug("destPath=" + destPath);//真正写到磁盘上File file = new File(destPath);OutputStream out = new FileOutputStream(file);InputStream in = picture.getInputStream();int length = 0;byte[] buf = new byte[1024];// in.read(buf) 每次读到的数据存放在buf 数组中while ((length = in.read(buf)) != -1) {//在buf数组中取出数据写到(输出流)磁盘上out.write(buf, 0, length);}in.close();out.close();} catch (FileUploadException e1) {logger.error("", e1);} catch (Exception e) {logger.error("", e);}PrintWriter printWriter = response.getWriter();response.setContentType("application/json");response.setCharacterEncoding("utf-8");HashMap<String, Object> res = new HashMap<String, Object>();res.put("success", true);printWriter.write(JSON.toJSONString(res));printWriter.flush();}

拍着胸脯保证,这代码你拷贝下去就能用,而且还不要求你用什么框架(我这里因为项目本身用了spring,我只是用了它的RequestMapping,但是上传逻辑本身,是和spring无关的)。

解释一下:
1.String path = request.getRealPath(“/upload”) + “/”;
这个是图片的存放路径,根据打印的信息可以看到,upload目录就建在根目录下。
2.微信小程序上传的图片文件名都是wx-file.jpg,我这里取了从前端传过来的userId为文件命名。userId需要放在wx.uploadFile的formData中。

撒花,搞定。
由于微信小程序上传图片api要求只能是HTTPS POST请求,而本地是不支持HTTPS的,所以调试的时候颇费了周折。还好,搞定了。感谢CCAV,感谢老公,感谢自己。
晚安。

附上微信小程序的代码

注意设置header

  wx.uploadFile({url: 'https://xxxxxx/upload/picture',filePath: filePath,//图片路径,如tempFilePaths[0]name: 'image',header : {"Content-Type": "multipart/form-data"},formData:{userId: 12345678 //附加信息为用户ID},success: function (res) {console.log(res);},fail: function (res) {console.log(res);},complete: function (res) {}})

微信小程序开发之图片上传+Java服务端接收相关推荐

  1. 微信小程序开发(二)图片上传

    更新2017-08-24 更新七牛SDK只最新7.0.5版本. 在之前的博客<Node.js+express+MySQL使用七牛云实现的用户头像修改>,已经实现了在MUI框架或者< ...

  2. 微信小程序开发之文件上传下载应用场景(附Demo源码)

    微信小程序开发之文件上传下载应用场景(附Demo源码),Demo为小相册应用,源码在附件中,本示例需要腾讯云支持. http://www.henkuai.com/forum.php?mod=viewt ...

  3. 微信小程序如何把图片上传至服务器

    微信小程序如何把图片上传至服务器 前些日子接了个任务就是开发一个小程序,遇到了一个问题就是需要图片上传至服务器并保存记录,遵循着解决思路我们先从最开始入手 1:微信上传接口 2:服务器接收接口 3:保 ...

  4. 微信图片 自动上传到服务器,微信小程序怎样使图片上传至服务器

    这次给大家带来微信小程序怎样使图片上传至服务器,微信小程序使图片上传至服务器的注意事项有哪些,下面就是实战案例,一起来看一下.-wxml 发布项目 /**选择图片 */ choose: functio ...

  5. 微信小程序开发之——拍照上传

    一 拍照效果 拍照前 拍照后 二 业务流程 拍照前,显示取消和拍照按钮 拍照后,显示预览画面及重拍.取消.拍照和上传按钮 点击重拍,预览界面被拍照界面替换 点击上传,上传拍照预览的图片 点击取消,返回 ...

  6. 微信小程序开发之——文件上传

    一 概述 将录像的结果传递给服务器,服务端提供的接口文档为: 字段名称 字段类型 字段说明 必填项 示例 token String token 是 服务器下发的token(header) file F ...

  7. 微信小程序用户头像编辑上传

    微信小程序用户头像编辑上传 近期接触了一个小程序项目,需要可以修改用户头像,默认获取用户当前微信头像,点击头像,可调用手机照相机或者本地相册,更换图片. html代码如下: js代码:

  8. 微信小程序+SpringBoot实现文件上传与下载

    微信小程序+SpringBoot实现文件上传与下载 1.文件上传 1.1 后端部分 1.1.1 引入Apache Commons FIleUpload组件依赖 1.1.2 设置上传文件大小限制 1.1 ...

  9. 微信小程序java中文乱码_如何解决微信小程序显示中文无法上传或者出现乱码的问题?...

    今天小编给大家讲解如何解决微信小程序显示中文无法上传或者出现乱码的问题?有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的. 在formData中对文字进行编码,使用encodeURI() ...

最新文章

  1. 语音信号处理_书单 | 语音研究进阶指南
  2. 全面剖析linux【bind】服务お理论篇
  3. uvc音频传输协议_蓝牙中的三种音频编码:Apt-X、SBC、AAC,请问分别有什么区别?...
  4. python多进程断点续传分片下载器
  5. cpu性能测试软件 国际象棋,国际象棋、科学计算,整机性能测试
  6. android 照片旋转并保存
  7. Docker详解(三)——Docker安装与部署
  8. 【 Codeforces Round #301 (Div. 2) D】Bad Luck Island【概率DP】
  9. excel 第2讲:单元格格式设置
  10. 设计一个小型的物联网应用系统_点赞 | 面向能源物联网的智能传感芯片设计与应用...
  11. nexus 发布报错 Not authorized
  12. Spring IOC介绍
  13. 一个C#开发者用Java搭建Android框架的心路历程
  14. 佳明比华为的手表好在哪
  15. Java动态初始化数组,元素默认值规则
  16. 魅族note8完美打开usb调试模式的教程
  17. [导入]Web聊天:八个优秀的网页聊天服务
  18. innodb和myISAM 1075
  19. c# .net 读取word文档文件,.txt、.doc、.docx、.xls、xlsx
  20. STM32HAL库RS485-ModBus协议控制伺服电机

热门文章

  1. web性能优化SEO
  2. 前端提高篇(127):es6类的继承
  3. 哈夫曼树(Huffman Tree),与哈夫曼编码
  4. Springboot三层架构--DAO层、Service层、Colltroler层--这波我在外太空
  5. Mobaxterm使用小技巧(log文件、宏命令录制)
  6. 关于农业银行APP的一个功能易用性的思考
  7. jQ的事件和DOM操作 笔记分享
  8. JQ点击事件click和on区别
  9. 手机视频怎么做成二维码?一分钟教你快速制作视频二维码
  10. 重置服务器硬件管理口 IMM IPMI BMC 密码