【项目实训】图床的手把手搭建流程

(第一周)文章一

背景

在项目实训中,需要使用到Markdown编辑器保存信息,但如果使用图片进行插入的话实现不佳,因而考虑使用图床实现,之后将外链返回使Markdown能够显示图片。
后端:SpringBoot-Maven-jdk1.8

服务器选择

通过总多图床筛选,排除了只有图床服务的图床,而使用小型的存储服务器,最终选定七牛云【有免费10G的存储空间】

实现

  1. 服务器配置,首先需要去七牛云开通账号,进行实名认证后即可申请“对象存储Kodo”,之后在其空间管理中新建空间,配置为公开空间(方便图片获取),并配置外链域名(七牛云会送个30天的外链域名,暂时不知道过期后会怎样),之后便可以尝试手动上传文件。
    【项目实训】图床的手把手搭建流程_第1张图片

  2. 七牛云有其SDK支持
    java:https://developer.qiniu.com/kodo/1239/java#install-by-maven
    之后的操作基本按照其SDK进行
    添加依赖

    <dependency>
      <groupId>com.qiniugroupId>
      <artifactId>qiniu-java-sdkartifactId>
      <version>[7.7.0, 7.7.99]version>
    dependency>
    
  3. 上传凭证设置

    String accessKey = "你的accessKey";
    String secretKey = "你的secretKey";
    String bucket = "你的bucket";
    
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket);
    

    accessKey和secretKey可以在个人中心-密钥管理中获取
    bucket就是创建的存储空间

  4. 上传管理配置

    Configuration cfg = new Configuration(Region.region0());
    UploadManager uploadManager = new UploadManager(cfg);
    
  5. 上传

    try {
            Response response = uploadManager.put(uploadBytes, filename, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            map.put("key", putRet.key);
            map.put("hash", putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
        return map;
    
  6. 由于需求只在于让Markdown更加方便显示图片,所以只需要拼接外链,公共空间的好处就在于拼接外链十分方便

    public static String outerChainBuild(String fileName) {
        String domainOfBucket = "你的外链域名";
        String encodedFileName;
        try {
            encodedFileName = URLEncoder.encode(fileName, "utf-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("拼接错误");
            return null;
        }
        return String.format("%s/%s", domainOfBucket, encodedFileName);
    }
    

图片压缩

与七牛云交互部分上面已经完成
图片压缩采用Thumbnails依赖
添加依赖:

		<dependency>
			<groupId>net.coobirdgroupId>
			<artifactId>thumbnailatorartifactId>
			<version>0.4.8version>
		dependency>

代码实现:

//如果文件大小超过5M进行压缩
if (file.getSize() >= 5 * 1024 * 1024) {
	try {
		Thumbnails.of(file.getInputStream())
			.scale(1f)
			.outputQuality(0.5f)//输出质量变为0.5倍
			.outputFormat("jpg")//输出格式为jpg
			.toOutputStream(outputStream);
		uploadBytes = outputStream.toByteArray();
		map = QiNiuPicture.upload(fileName, uploadBytes);
	} catch (IOException e) {
		e.printStackTrace();	
		System.out.println("图片压缩失败");
	}
} else {
	try {
		uploadBytes = file.getBytes();
		map = QiNiuPicture.upload(fileName, uploadBytes);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

Thumbnails的更多方法可以在其他文章学习

图片识别

由于上传的部分在设计中都放在一起,所以需要对识别上传的文件是否是图片
枚举类:

public enum PictureType {
    jpg(0, "jpg"), png(1, "png");

    private final int key;
    private final String value;

    PictureType(int key, String value) {
        this.key = key;
        this.value = value;
    }

    public int getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }

    /**
     * 判断输入的字符串是否属于图片格式
     *
     * @param check String 输入的判断字符串,一般为文件后缀
     * @return boolean true表示在其中 false表示不在其中
     */
    public static boolean isInclude(String check) {
        for (PictureType p : PictureType.values()) {
            if (p.getValue().equals(check)) {
                return true;
            }
        }
        return false;
    }
}

获取文件后缀然后调用isInclude方法即可

备注

暂未进行测试

你可能感兴趣的:(项目实训,markdown,服务器)