Springboot2整合阿里云OSS实现文件上传、下载、删除、查看

2023-11-12

1.阿里云配置

https://jingyan.baidu.com/article/ea24bc3973db059a63b3316d.html

2.pom文件

          <!--<version>2.1.5.RELEASE</version> springboot版本-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>

3.配置文件

server.port=8083

spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB

#地域节点
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
#用户accesskey id
aliyun.oss.file.keyid=xxxxxxxxxx
#用户accesskey secret
aliyun.oss.file.keysecret=xxxxxxxxxx
#相当于是哪个库
aliyun.oss.file.bucketname=xiaozhuya
#文件路径
aliyun.oss.file.filehost=avatar

4.配置类

public class ConstantPropertiesUtil implements InitializingBean {

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

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

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

	@Value("${aliyun.oss.file.filehost}")
	private String fileHost;

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

	public static String END_POINT;
	public static String ACCESS_KEY_ID;
	public static String ACCESS_KEY_SECRET;
	public static String BUCKET_NAME;
	public static String FILE_HOST ;

	@Override
	public void afterPropertiesSet() throws Exception {
		END_POINT = endpoint;
		ACCESS_KEY_ID = keyId;
		ACCESS_KEY_SECRET = keySecret;
		BUCKET_NAME = bucketName;
		FILE_HOST = fileHost;
	}

}

5.编写Service

public interface FileService {

	/**
	 * 文件上传至阿里云
	 * @param file
	 * @return
	 */
	String upload(MultipartFile file);

	void download(String name);

	void logDownload(String name, HttpServletResponse response) throws Exception;

	String deleteFile(String filename);
}

6.实现类

@Service
public class FileServiceImpl implements FileService {

    static String[] TYPESTR = {".png",".jpg",".gif",".jpeg"};

    @Override
    public String upload(MultipartFile file) {

        Boolean flag = false;
        for(String type : TYPESTR){
            if(StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)){
                flag = true;
                break;
            }
        }
        if(!flag){
           /* throw  new GuliException(ResultCodeEnum.FILE_UPLOAD_ERROR);*/
            return  "文件格式不正确";
        }
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        String uploadUrl="";
        try {
            //2、怎么判断文件内容—> 如果我上传的是rm -rf /* 脚本
            BufferedImage image = ImageIO.read(file.getInputStream());
            if(image == null){
             // throw  new GuliException(ResultCodeEnum.FILE_NULL_ERROR);
                return "文件内容不正确";
            } else{
                System.err.println(image.getHeight());
                System.err.println(image.getWidth());
            }
            //判断oss实例是否存在:如果不存在则创建,如果存在则获取
            OSSClient ossClient = new OSSClient(ConstantPropertiesUtil.END_POINT,
                    ConstantPropertiesUtil.ACCESS_KEY_ID,ConstantPropertiesUtil.ACCESS_KEY_SECRET);
            if (!ossClient.doesBucketExist(bucketName)) {
                //创建bucket
                ossClient.createBucket(bucketName);
                //设置oss实例的访问权限:公共读
                ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            }

            //获取上传文件流
            InputStream inputStream = file.getInputStream();

            //构建日期路径:avatar/2019/02/26/文件名
            String filePath = new DateTime().toString("yyyy/MM/dd");

            //文件名:uuid.扩展名
            String original = file.getOriginalFilename();
            String fileName = UUID.randomUUID().toString();
            String fileType = original.substring(original.lastIndexOf("."));
            String newName = fileName + fileType;
            String fileUrl = ConstantPropertiesUtil.FILE_HOST + "/" + filePath + "/" + newName;

            //文件上传至阿里云
            ossClient.putObject(bucketName, fileUrl, inputStream);

            // 关闭OSSClient。
            ossClient.shutdown();

            //获取url地址
            uploadUrl = "http://" + bucketName + "." + ConstantPropertiesUtil.END_POINT + "/" + fileUrl;

        } catch (IOException e) {
           // throw new GuliException(ResultCodeEnum.FILE_UPLOAD_ERROR);
        }
        return uploadUrl;
    }

    @Override
    public void download(String name) {
        OSSClient ossClient = new OSSClient(ConstantPropertiesUtil.END_POINT,
                ConstantPropertiesUtil.ACCESS_KEY_ID,ConstantPropertiesUtil.ACCESS_KEY_SECRET);
        //构建日期路径:avatar/2019/02/26/文件名
        String filePath = new DateTime().toString("yyyy/MM/dd");
        File file = new File("E:\\imags.jpg");
        ossClient.getObject(new GetObjectRequest(ConstantPropertiesUtil.BUCKET_NAME, ConstantPropertiesUtil.FILE_HOST+"/" + filePath + "/"+name),file );
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    @Override
    public void logDownload(String name, HttpServletResponse response) throws Exception {
        OSSClient ossClient = new OSSClient(ConstantPropertiesUtil.END_POINT,
                ConstantPropertiesUtil.ACCESS_KEY_ID,ConstantPropertiesUtil.ACCESS_KEY_SECRET);
        //设置响应头为下载
        response.setContentType("application/x-download");
        //设置下载的文件名
        response.addHeader("Content-Disposition", "attachment;fileName=" + name);
        response.setCharacterEncoding("UTF-8");
        String filePath = new DateTime().toString("yyyy/MM/dd");//上传的路径按理来说需要保持到数据库,显示连接到页面。
        String osskey = osskey(ConstantPropertiesUtil.FILE_HOST, filePath, name);
        OSSObject ossObject = ossClient.getObject(ConstantPropertiesUtil.BUCKET_NAME,osskey);
        InputStream is = ossObject.getObjectContent();
        BufferedInputStream bis = null;//定义缓冲流
        try {
            bis = new BufferedInputStream(is);//把流放入缓存流
            OutputStream os = response.getOutputStream();//定义输出流的响应流。
            byte[] buffer = new byte[1024];//定义一个字节数
            int len;//记录每次读入到cbuf数组中的字符的个数
            while ((len = is.read(buffer)) != -1) {//开始输出
                System.out.println(len);
                System.out.println(buffer);
                os.write(buffer,0,len); //从数组中每次写出len个字符
            }
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ossClient!=null){
                // 关闭OSSClient。
                ossClient.shutdown();
            }
        }
    }

    @Override
    public String deleteFile(String filename) {
        String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
        String fileHost = ConstantPropertiesUtil.FILE_HOST;
        String filePath = new DateTime().toString("yyyy/MM/dd");

      //建议在方法中创建OSSClient 而不是使用@Bean注入,不然容易出现Connection pool shut down
        OSSClient ossClient = new OSSClient(ConstantPropertiesUtil.END_POINT,
                ConstantPropertiesUtil.ACCESS_KEY_ID,ConstantPropertiesUtil.ACCESS_KEY_SECRET);
        //删除目录中的文件,如果是最后一个文件fileoath目录会被删除。
        ossClient.deleteObject(bucketName,fileHost+"/" + filePath + "/"+filename);
        try {
        } finally {
            ossClient.shutdown();
        }
        return  "success";
    }
    public  String osskey(String fileHost,String filePath,String name){

        String osskey = fileHost+"/"+filePath+"/"+name;
        return  osskey;
    }
}

7.为了好测试加入Swagger

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!--swagger ui-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

8.配置Swagger

@Configuration
@EnableSwagger2
public class Swagger2Config {

	@Bean
	public Docket webApiConfig(){

		return new Docket(DocumentationType.SWAGGER_2)
				.groupName("webApi")
				.apiInfo(webApiInfo())
				.select()
				//.paths(Predicates.not(PathSelectors.regex("/admin/.*")))
				.paths(Predicates.not(PathSelectors.regex("/error.*")))
				.build();

	}
	private ApiInfo webApiInfo(){
		return new ApiInfoBuilder()
				.title("网站-用户中心API文档")
				.description("本文档描述了课程中心微服务接口定义")
				.version("1.0")
				.contact(new Contact("Helen", "http://xxxxx.com", "xxxx@qq.com"))
				.build();
	}

}

9.控制层

@Api(description = "阿里云文件上传")
@RequestMapping("/oss/file")
@RestController
public class FileController {

    @Autowired
    FileService fileService;

    @ApiOperation(value = "文件上传阿里云")
    @PostMapping("upload")
    public R upload(MultipartFile file, @RequestParam(value="host", required = false) String host){
        if (file!=null){
            if(!StringUtils.isEmpty(host)){
                ConstantPropertiesUtil.FILE_HOST = host;
            }
            String uploadurl = fileService.upload(file);
            return  R.ok().data("url",uploadurl);
        }
        return  R.error().message("文件不能为空!");
    }
    @ApiOperation(value = "文件下载到本地")
    @PostMapping("download/{name}")
    public R Download(@PathVariable String name){
        fileService.download(name);
        return  R.ok();
    }
    @ApiOperation(value = "浏览器文件下载")
    @GetMapping(value = "/downloads/{name}")
    public void logDownload(@PathVariable String name, HttpServletResponse response) throws Exception {
        fileService.logDownload(name, response);
    }

    @ApiOperation(value = "删除文件")
    @GetMapping("/deleteflie/{filename}")
    public R DeleteFile(@PathVariable String filename){

        String s = fileService.deleteFile(filename);
        return  R.ok().data("状态:",s);
    }
@Data
public class R {

	private Boolean success;

	private Integer code;

	private String message;

	private Map<String, Object> data = new HashMap<>();

	private R(){}

	public static R ok(){
		R r = new R();
		r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
		r.setCode(ResultCodeEnum.SUCCESS.getCode());
		r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
		return r;
	}

	public static R error(){
		R r = new R();
		r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
		r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
		r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
		return r;
	}

	public static R setResult(ResultCodeEnum resultCodeEnum){
		R r = new R();
		r.setSuccess(resultCodeEnum.getSuccess());
		r.setCode(resultCodeEnum.getCode());
		r.setMessage(resultCodeEnum.getMessage());
		return r;
	}

	public R success(Boolean success){
		this.setSuccess(success);
		return this;
	}

	public R message(String message){
		this.setMessage(message);
		return this;
	}

	public R code(Integer code){
		this.setCode(code);
		return this;
	}

	public R data(String key, Object value){
		this.data.put(key, value);
		return this;
	}

	public R data(Map<String, Object> map){
		this.setData(map);
		return this;
	}
}



---------------------------------------------------------------
@Getter
public enum ResultCodeEnum {

	SUCCESS(true, 20000,"成功"),
	UNKNOWN_REASON(false, 20001, "未知错误"),
	BAD_SQL_GRAMMAR(false, 21001, "sql语法错误"),
	JSON_PARSE_ERROR(false, 21002, "json解析异常"),
	PARAM_ERROR(false, 21003, "参数不正确"),
	FILE_UPLOAD_ERROR(false, 21004, "文件上传错误,选择正确的格式"),
	EXCEL_DATA_IMPORT_ERROR(false, 21005, "Excel数据导入错误"),
	ARITHMETIC_ERROR(false,21111,"算数异常!不能除0"),
	TEACHER_NULL_ERROR(false, 23333, "没有该讲师,请重新输入!"),
	FILE_NULL_ERROR(false,25555,"文件内容不正确"),
	FETCH_PLAYAUTH_ERROR(false,26666,"播放错误")
	;


	private Boolean success;

	private Integer code;

	private String message;

	private ResultCodeEnum(Boolean success, Integer code, String message) {
		this.success = success;
		this.code = code;
		this.message = message;
	}
}

10.输入http://localhost:8083/swagger-ui.html#/测试

其他的可以自行试。网页下载文件需要在浏览器中输入,不要在swagger中测试

上传到阿里云的OSS上有一个地址访问:https://xiaozhuya.oss-cn-beijing.aliyuncs.com/avatar/2020/07/15/c48fc2af-08e6-4e67-a667-ebbe3d6a4b73.jpg   把他放到页面中的<a> 标签中的src就可以显示啦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot2整合阿里云OSS实现文件上传、下载、删除、查看 的相关文章

  • OSGI - 处理捆绑包所需的第 3 方 JAR

    我刚刚开始 OSGI 开发 正在努力了解如何最好地处理依赖的 JAR 也就是说 如果我要创建一个捆绑包 我很可能需要使用一些第 3 方 JAR 当我创建要部署到 OSGI 的捆绑包 JAR 时 显然不包含这些第 3 方 JAR 因此该捆绑包
  • Java 8 Streams - 按层次结构对嵌套列表进行排序

    给出以下示例 我想要一个对列表和嵌套列表进行排序的流函数 class Foo public int sort public List
  • Java中如何做系统捷径跨平台集成?

    您可能知道 Mac OS X 中保存的快捷键是Cmd S在 Windows 上是Ctrl S 关闭应用程序的捷径是Cmd QWindows 是Alt F4 但问题是如何在 java 应用程序中执行这些操作 我是否需要找到我在应用程序中使用的
  • Import 语句顺序有什么影响吗?

    这个疑问由来已久 当我使用 eclipse 编写类时 导入语句会自动填充 import语句的顺序有影响吗 1 关于编程执行速度 2 任何标准编码实践都是相同的 import语句对执行速度没有影响at all 它们仅在编译时重要 如果您完全限
  • 无法在 Junit 测试中自动装配 JpaRepository - Spring boot 应用程序

    Hi All 我正在尝试在 Spring boot 应用程序中执行 Junit 测试 Junit 应该测试一些 CRUD 操作 我正在使用 Spring Repositories 特别是 JpaRepository 存储库类 package
  • 翻转旋转和图像

    我正在用 Java 编写一个平台游戏 并且正在手动编码玩家动画 我分别为每个肢体设置动画 改变位置和旋转 当玩家面向右时 这工作得很好 但是当玩家面向左时 我不知道如何处理旋转 以使它们在玩家向左转时看起来相同 每个身体部位的位置都是相对于
  • 在 eclipse indigo 中找不到 Window builder pro

    我读到 Eclipse Indigo 安装了 Window Builder Pro 插件 但我不知道它在哪里 文件 新建 项目没有给我选择 Window Builder Pro 的选项 如何找到它 您需要将此更新站点添加到 Eclipse
  • 仅以 int 形式显示和保存小时数

    如何仅显示小时并使用 int 变量 我的意思是打印时间 例如 20 30 44 PM 我只想存储小时 即 int 变量中的 20 小时 怎么做 有谁知道的话可以告诉我密码吗 谢谢 尝试使用日历get http docs oracle com
  • java:查找数组中整数的频率

    我需要开发一个java要求用户输入一些内容的程序integers并找出最大和最小的数 以及这些数的平均值 然后 划分数组的集合分成若干子区间用户指定的 然后它生成一个边界点 每个边界点的长度为子区间宽度 问题是我需要创建一个频率 例如 间隔
  • 如何通过Java编码在运行时将My Jar加载到ClassPath?

    我正在 Net Beans 中使用 Swing 我有自己的 jar 其中包含类和方法 我将使用 JAVA Reflection API 调用这些类和方法 但在此之前我想在运行时将 Jar 加载到类路径中 我有一个 J 按钮 单击该按钮我将获
  • 相机 java.lang.RuntimeException:setParameters 失败

    我使用创建了一个自定义相机应用程序this https github com davidgatti dgCam源代码 但在少数设备上 例如高分辨率设备 我得到 RuntimeException setParameters failed 我面
  • 为什么在步骤中将 TransactionManager 设置为 JPATransactionManager 不正确?

    我正在使用 Spring Batch 和 JPA 并且经历了 TransactionManager bean 冲突 我通过在步骤中将 TransactionManager 设置为 JpaTransactionManager 找到了解决方案
  • 在节点上生成 AES 密钥

    我正在处理一个使用自定义协议来加密通信的遗留应用程序 随机 AES 密钥在旧版 Java 应用程序中生成 如下所示 keygen KeyGenerator getInstance AES keygen init 128 keygen gen
  • 无法加载(查找)j2v8_android_x86 库

    我有一个使用的 gradle 项目j2v8 android 2 2 1 http mvnrepository com artifact com eclipsesource j2v8 j2v8 android 2 2 1库 为 V8 JS 引
  • 为什么桌面 AES 文件 IO 与 Android AES 文件 IO 不兼容?

    我已将一个应用程序从 Android 移植到桌面 该应用程序使用 AES 加密一些私人数据 两个应用程序都能够加密和解密数据以供自己使用 但无法解密其他应用程序的数据 AES 密钥 IV 和算法是相同的 这两个应用程序之间的主要区别在于 a
  • 如何使用 Solr 索引 pdf 内容?

    我正在尝试使用 SolrJ 索引一些 pdf 文档 如下所述http wiki apache org solr ContentStreamUpdateRequestExample http wiki apache org solr Cont
  • 对需要强制转换的 Java 泛型感到困惑

    我对以下代码感到困惑 import java util ArrayList import java util LinkedList import java util List public class GenericsTest
  • 源单元“_BuildScript_”中“语义分析”阶段出现异常

    评估根项目 android 时出现问题 配置项目 app 时出现问题 无法打开构建文件 C Users InFED Laptop Documents GitHub sustain and save android app build gra
  • 封闭实例的匿名类

    我正在阅读 Joshua Bloch 的 Effective Java 第二版 目前我在第 22 项 它描述了内部类和嵌套类 但我无法理解他这句话的意思 匿名类具有封闭实例当且仅当它们发生时 在非静态上下文中 有人能给我一个代码示例并解释它
  • Android 回调监听器 - 将 SDK 中的 pojo 的值发送到应用程序的 Activity

    我有一个深埋在 SDK 中的 java 类 它执行一个操作并返回一个布尔值 它不知道应用程序的主要活动 但我需要主要活动来接收该布尔值 我见过很多关于回调 广播和监听器的问题 但他们似乎都了解该活动 我的 pojo 确实有一个 Activi

随机推荐

  • python与vb可以互换吗_vb和python混合编程

    展开全部 解题思路 把 Python 设计成带命令行参数调用的形式 在 VB6 中借助 IWshRuntimeLibrary WshShell Exec 方法进行命令行参数调用 通过 IWshRuntimeLibrary WshExec S
  • 闲谈开闭原则——基于UI动画框架

    本文继续聊另外一个设计原则 开闭原则 在UI动画框架中 开闭原则在 动画策略 和 移动算法 这两个类体系中均有所体现 照旧 先看一下开闭原则的定义 1 开闭原则 一个软件实体如类 模块和函数应该对扩展开放 对修改关闭 有人说过 唯一不变的就
  • No artifacts marked for deployment 解决方法(ideaweb项目配置tomcat步骤)

    No artifacts marked for deployment 出现这种情况的原因 创建新项目的时候要先添加freework support 步骤如下 添加完成后点击添加tomcat的位置 有main的情况也不影响 接下来按下面步骤就
  • 【airtest架构】pytest+pocoui+airtest+allure 完成安卓UI自动化框架

    一 背景 为了做app的自动化 由于app元素定位麻烦或者定位不稳定 又或者使用驱动版本等原因 不想使用启动appnium服务的方式 本文采用网易的airtest框架图像识别作为基础 配合pytest进行简单的二次开发形成一套对安卓app
  • 操作系统内存管理4.21

    离散内存管理方案 为了提高内存的利用率 缺点 访问效率下降 分页式内存管理方案 现代操作系统常用方案 分段式内存管理方案 段页式内存管理方案
  • 【Vue】/deep/、>>>、v::deep 三种深度选择器

    在 Vue项目中 当一个组件使用了 scoped 特性时 组件内的样式只会应用于组件自身 但是有时候我们需要在 父组件中改变子组件中的样式 这时就需要用到深度选择器 一 deep 二 gt gt gt search input gt gt
  • uni-app 使用Weex/nvue的注意事项

    介绍 uni app App端内置了一个基于 weex 改进的原生渲染引擎 提供了原生渲染能力 在App端 如果使用vue页面 则使用webview渲染 如果使用nvue页面 native vue的缩写 则使用原生渲染 一个App中可以同时
  • java 日历 获取月份_使用Java日历获取月份和年份的星期

    要使用Calendar类 请导入以下程序包 import java util Calendar 创建一个Calendar类对象 Calendar cal Calendar getInstance 现在 使用以下字段获取月份和年份的星期 Ca
  • 浅析:Spring框架中IOC容器和Bean的配置

    一 IOC和DI的解释 1 IOC Inversion of Control 反转控制 在应用程序中的组件需要获取资源时 传统的方式是组件主动的从容器中获取所需要的资源 在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式 增加
  • 深度学习在情感分类中的应用

    简介与背景 情感分类及其作用 情感分类是情感分析的重要组成部分 情感分类是针对文本的情感倾向进行极性分类 分类数量可以是二分类 积极或消极 也可以是多分类 按情感表达的不同程度 情感分析在影音评论 商品评价 舆情分析 股民基金情感分析等都有
  • csgo显示服务器ip,CSGO所有服务器IP段/地理位置

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 SDR服务器IP段 atl addresses 162 254 199 170 27015 27050 162 254 199 171 27015 27050 ams addresses 155
  • 【构建ML驱动的应用程序】第 7 章 :使用分类器编写推荐

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 【C++/STL】手撕红黑树

    文章目录 1 红黑树的概念 1 1红黑树的性质和规则 2 红黑树的模拟实现 2 1节点的定义 2 2节点的插入 1 情况一 u存在且为红色 2 情况二 u不存在 u存在且为黑 并且g p cur为一条直线 3 情况三 u不存在 u存在且为黑
  • Ansible基础3——playbook

    文章目录 一 基本了解 二 编写playbook 2 1 单剧本 2 2 多剧本 2 3 特权升级 2 4 语法优化 三 模块查找 一 基本了解 为什么要写playbook 前面我们可以使用临时命令对受控机进行操作 但当有重复性的工作时就不
  • 自定义带参数二维码扫码进入微信小程序获取参数

    第一步 需要进入小程序后台 开发设置里 添加二维码规则 第二步 添加好扫码进入的规则 比如扫码进去小程序的指定页面 1 协议类型选择https 2 选择小写 3 二维码规则 这个看文档有些人估计会比较迷糊 简单理解一下就是一个https的路
  • 后台@RequestBody接收对象List属性为null

    后台 RequestBody接收对象List属性为null 前端把一个本应传String类型的属性 传成了List数组 会导致后面的所有List属性都会变成null
  • C语言扫雷解析

    目录 扫雷功能说明 游戏界面 游戏分析设计 数据结构的分析 文件结构设计 扫雷游戏代码的实现 game h game c 初始化数组 打印棋盘 布置雷 统计周围雷的个数 排查结果判定 test c 扫雷功能说明 使用控制台实现经典的扫雷游戏
  • php模块化供前端ajax调用的实现

    背景 没有使用php框架 由于临时需求 需要ajax调用php中的方法 简单的写了一个php文件 文件定义了两个方法 如何用ajax分别调用同一个php文件不同的方法 以下是abc php文件 我定义的两个方法a方法和b方法
  • 发现了uroport工具的一个bug,还不知道如何解决

    点击条件属性下的 配置条件 进行配置的 让一个属性等于0的时候控制样式 预览 保存一切正常 等到下次打开这个文件的时候 表示等于的双等号 变成了undefined 如下图 这时候点保存 或者预览 都也点不了 但是不耽误使用 也可以一个一个将
  • Springboot2整合阿里云OSS实现文件上传、下载、删除、查看

    1 阿里云配置 https jingyan baidu com article ea24bc3973db059a63b3316d html 2 pom文件