深入讲解微信小程序上传图片与JAVA后台的结合

背景

微信小程序上传文件是微信小程序提供的API之一,如果用JAVA后台如何来处理上传的文件呢?

官方文档

UploadTask wx.uploadFile(Object object)

将本地资源上传到服务器。客户端发起一个 HTTPS POST 请求,其中 content-type 为 multipart/form-data

参数

Object object

属性类型默认值必填说明最低版本
urlstring 开发者服务器地址 
filePathstring 要上传文件资源的路径 (本地路径) 
namestring 文件对应的 key,开发者在服务端可以通过这个 key 获取文件的二进制内容 
headerObject HTTP 请求 Header,Header 中不能设置 Referer 
formDataObject HTTP 请求中其他额外的 form data 
timeoutnumber 超时时间,单位为毫秒2.10.0
successfunction 接口调用成功的回调函数 
failfunction 接口调用失败的回调函数 
completefunction 接口调用结束的回调函数(调用成功、失败都会执行) 

object.success 回调函数

参数

Object res

属性类型说明
datastring开发者服务器返回的数据
statusCodenumber开发者服务器返回的 HTTP 状态码

创建小程序与编写代码 

创建小程序就不说了,如果不是开发小程序,也不会来搞上传文件。上传的关键代码如下

    wx.uploadFile({
      url: getApp().globalData.host + '/uploadImage',
      filePath: "/images/full_cart.png",
      name: 'img',

      success: (res) => {
        console.log("upload succeed")
        var data = res.data;
        console.log(data);
      }, fail: () => {
        console.log("upload failed")
      }
    })

对于以上代码上传文件的关键参数有三个。

第一个参数:url。这个参数是服务器的地址。本文中,我们的服务器是在本地的Tomcat,那就自然而然的是 localhost:8080,也可以直接写成  url: 'http://localhost:8080/uploadImage' 。 uploadImage 表示的是Controller的地址,下面会讲到。

按照上文的写法是因为我在App.js里面做了全局配置,

 globalData: {
    host: 'http://localhost:8080',
  }

第二个参数:filePath。这个参数是我要上传的文件 

第三个参数 name,是为这个图片对象设定的key。在Controller中用到。

JAVA后台工程创建与编码

JAVA后台,也叫JAVA后端吧,总之就是服务器的意思。

这里面选择的是Spring Boot 创建的Maven工程,在工程比中创建一个Controller,并编码。代码如下。



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;


/**
 * @author kangyucheng
 */
@Controller
public class UploadController {

    private final static Logger logger = LoggerFactory.getLogger(UploadController.class);

    @PostMapping("/uploadImage")
    @ResponseBody
    public String uploadImageFile(@RequestParam("img") MultipartFile uploadImage) throws IOException {

        String fileName = uploadImage.getOriginalFilename();
        String imgFilePath = "/Users/yuchk/Desktop/";
        File targetFile = new File(imgFilePath, fileName);
        //保存
        uploadImage.transferTo(targetFile);
        logger.info("图片存储成功");
        return "success";

    }
}

需要注意的是

@PostMapping("/uploadImage") 要和微信小程序中的url参数中地址保持一致,
@RequestParam("img") 要和微信小程序中的name保持一致。

本地调试

本地调试的过程中首先要启动Spring boot的工程。

然后编译小程序,去触发上传的事件。

记得开启不校验合法域名。

本地调试结果 

真机调试 

 由于服务器是在本地开启的,那么在真机无法访问本地服务器的情况下,必然是会失败的。

后台错误的陷阱

假设我们的后台发生了异常,那么微信小程序是没法处理的。依然会当成上传成功处理。

修改代码


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;


/**
 * @author kangyucheng
 */
@Controller
public class UploadController {

    private final static Logger logger = LoggerFactory.getLogger(UploadController.class);

    @PostMapping("/uploadImage")
    @ResponseBody
    public String uploadImageFile(@RequestParam("img") MultipartFile uploadImage) throws Exception {

        String fileName = uploadImage.getOriginalFilename();
        String imgFilePath = "/Users/yuchk/Desktop/";
        File targetFile = new File(imgFilePath, fileName);
        //保存
        uploadImage.transferTo(targetFile);
        logger.info("图片存储成功");
        throw new Exception("故意的,哈哈");
       
    }
}

 再次本地触发文件上传事件。

结论: 要根据不同的返回结果,来判定文件是否到底上传成功。

其他需要注意的地方

如果忘记写  @ResponseBody  注解,那可能是这种情况,虽然图片上传成功,但是返回给微信小程序的就不是我们预设的内容了。

 

如果返回的是一个自定义的类,那么也会发生错误。



/**
 * @author kangyucheng
 */
@Controller
public class UploadController {

    private final static Logger logger = LoggerFactory.getLogger(UploadController.class);

    @PostMapping("/uploadImage")
    @ResponseBody
    public M uploadImageFile(@RequestParam("img") MultipartFile uploadImage) throws Exception {

        String fileName = uploadImage.getOriginalFilename();
        String imgFilePath = "/Users/yuchk/Desktop/";
        File targetFile = new File(imgFilePath, fileName);
        //保存
        uploadImage.transferTo(targetFile);
        logger.info("图片存储成功");
        return new M("a","b");

    }
}
class M{
    String a;
    String b;
    public M(String a,String b){
        this.a = a;
        this.b = b;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康雨城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值