IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 微信小程序上传图片解决方案+oss+后端代码 -> 正文阅读

[移动开发]微信小程序上传图片解决方案+oss+后端代码

微信小程序上传图片解决方案+oss+后端代码

目的

最近需要整合小程序作一个图片上传至阿里云oss存储里。故以此来记录此解决方案。

实践

小程序

本次前端采用的是小程序的lin-ui框架的图片选择器(lin-ui框架不做阐述)

<l-image-picker count="9" bind:linchange="onChangeTap" size="3" id="imagePicker" />
<l-message />

图片上传函数

async wxPostPicture() {
        let that = this
        // lin-ui的开放函数
        const imagePicker = this.selectComponent('#imagePicker');
        let urls = imagePicker.linGetValue();
        for (let i = 0; i < urls.length; i++) {
            wx.uploadFile({
                url: "你的图片上传服务地址",
                filePath: urls[i],
                name: "files",
                header: {
                    "Content-Type": "multipart/form-data",
                },
                success: function (res) {
                    let datas = JSON.parse(res.data)
                    if (datas.code === 200) {
                        that.data.imgLists.push(datas.data)
                        that.setData({
                            imgLists: that.data.imgLists,
                        })
                    } else {
                        wx.lin.showMessage({
                            content: '上传图片失败'
                        })
                    }
                }
            })
        }
    }

注意:wx.uploadFile的是采用异步的形式,故需要先统一等待时间,才能获取完整的图片,你可以在调用图片地址之前先sleep一段时间。如下

   // 异步暂停时间
    delay: function (milSec) {
        return new Promise(resolve => {
            setTimeout(resolve, milSec)
        })
    },

java后端

依赖

        <!--OSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.1.3</version>
        </dependency>

配置文件

aliyun:
  oss:
    file:
      endPoint: "你的阿里云oss存储公网地址"
      keyid: "在oss中创建用户并创建key"
      keysecret: "在oss中创建用户并创建key"
      bucketname: "你创建的bucket名字"

参数类


import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OssConstant implements InitializingBean {
    @Value("${aliyun.oss.file.endPoint}")
    private String oss_file_endpoint;

    @Value("${aliyun.oss.file.keyid}")
    private String oss_file_keyid;

    @Value("${aliyun.oss.file.keysecret}")
    private String oss_file_keysecret;

    @Value("${aliyun.oss.file.bucketname}")
    private String oss_file_bucketname;

    public static String OSS_END_POINT_IM;
    public static String OSS_BUCKET_IM;
    public static String OSS_ACCESS_KEY_ID_IM;
    public static String OSS_ACCESS_KEY_SECRET_IM;

    @Override
    public void afterPropertiesSet() throws Exception {
        OSS_END_POINT_IM = oss_file_endpoint;
        OSS_BUCKET_IM = oss_file_bucketname;
        OSS_ACCESS_KEY_ID_IM = oss_file_keyid;
        OSS_ACCESS_KEY_SECRET_IM = oss_file_keysecret;
    }
}


上传文件类



import cn.dev33.satoken.stp.StpUtil;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @version 1.0
 * @date 2021/5/29 21:48
 */
@Component
public class AliyunOSSUtil {
    private static final String accessKeyId = OssConstant.OSS_ACCESS_KEY_ID_IM;
    private static final String accessKeySecret = OssConstant.OSS_ACCESS_KEY_SECRET_IM;
    private static final String endpoint = OssConstant.OSS_END_POINT_IM;
    private static final String bucket = OssConstant.OSS_BUCKET_IM;
    // oss水印
    private static final String tag = "oss图片路径的参数,例如水印等参数,自行查询";
    private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class);

    public static String OSSUploadFile(MultipartFile file) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd : hh:mm:ss");
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            //容器不存在,就创建
            if (!ossClient.doesBucketExist(bucket)) {
                ossClient.createBucket(bucket);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucket);
                createBucketRequest.setCannedACL(CannedAccessControlList.Default);
                ossClient.createBucket(createBucketRequest);
            }
			// 在file.getOriginalFilename()之前的“/”为你bucket的文件夹,请自行修改。
            String fileUrl = "img" + "/" + StpUtil.getLoginId() + "-" + format.format(new Date()) + "-" + file.getOriginalFilename();

            //上传文件
            PutObjectResult result = null;
            try {
                result = ossClient.putObject(new PutObjectRequest(bucket, fileUrl, new ByteArrayInputStream(file.getBytes())));
            } catch (IOException e) {
                e.printStackTrace();
            }
            //设置权限 这里是公有权限读写
            ossClient.setBucketAcl(bucket, CannedAccessControlList.PublicRead);
            if (null != result) {
                logger.info("==========>OSS文件上传成功,OSS地址:" + fileUrl);
                return "fileUrl + tag;
            }
        } catch (OSSException oe) {
            logger.error(oe.getMessage());
        } catch (ClientException ce) {
            logger.error(ce.getMessage());
        } finally {
            //关闭
            ossClient.shutdown();
        }
        return null;
    }
}


controller类


/**
 * @Description:
 * @Author: chenzexiong
 * @Date: 2021/12/23 9:17
 * @Version 1.0:
 */

@RestController()
@RequestMapping("/test")
public class TbCommonController {

    @PostMapping(value = "picture/url/get")
    TbResult getPictureUrl(@RequestParam("files") MultipartFile files) {
        String url = AliyunOSSUtil.OSSUploadFile(files);
        return TbResult.success(url,"ok");
    }
}

总结

后端借鉴一篇博客,但找不到出处了,在此说明一下。
为了下次方便使用,仅以此来作记录。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:35:55  更:2021-12-24 18:36:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:06:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码