🎉🎉🎉🎉🎉🎉

欢迎访问的个人博客https://swzbk.site/,加好友,赚🧧🧧🧧

🎉🎉🎉🎉🎉🎉

1、blog-cms代码修改

  • 修改 NBlog-master/blog-cms/src/views/blog/blog/WriteBlog.vue文件 如下图,分别增加@imgAdd方法和ref引用

引入uploadPic方法: import {getCategoryAndTag, saveBlog, getBlogById, updateBlog,uploadPic} from '@/api/blog' 在methods中增加如下方法:

// 文章描述:将图片上传到服务器,返回地址替换到md中
imgAddTwo(pos, $file) {
   var _this = this
   var formdata = new FormData();
   formdata.append('image', $file);
   uploadPic(formdata).then((response) => {
      // 第二步.将返回的url替换到文本原位置![...](0) -> ![...](url)
      if (response.code === 200) {
         var url = response.msg;
         _this.$refs.mdedittwo.$img2Url(pos,url)
      }
    })
  },
// 文章正文:将图片上传到服务器,返回地址替换到md中
imgAdd(pos, $file) {
    var _this = this
    var formdata = new FormData();
    formdata.append('image', $file);
    uploadPic(formdata).then((response) => {
    // 第二步.将返回的url替换到文本原位置![...](0) -> ![...](url)
       if (response.code === 200) {
          var url = response.msg;
          _this.$refs.mdedit.$img2Url(pos,url)
       }
    })
 },
  • 修改 NBlog-master\blog-cms\src\api\blog.js 增加uploadPic方法
//swz 上传图片
  export function uploadPic(formdata) {
	return axios({
		url: 'upload',
		method: 'POST',
		Headers: {
			'Content-Type': 'multipart/form-data'
		},
  		data: formdata
  	})
  }

2、腾讯云cos购买与配置

购买cos资源包

分别购买以下三个资源,这里我分别买的都是最基础大小的:

利用腾讯云对象存储cos支持上传图片_ios

资源包介绍,这三是我们都用用到的:

利用腾讯云对象存储cos支持上传图片_java_02

查看资源包,购买完资源包就不用管了,这些资源会自动抵扣你之后用的存储桶

利用腾讯云对象存储cos支持上传图片_ios_03

创建存储桶:参考:存储桶

创建完成,查看存储桶:

利用腾讯云对象存储cos支持上传图片_Data_04

3、获取存储桶参数

存储桶基本参数:

  • 访问域名
  • 存储桶名称
  • 所属地域

获取密钥对参数:https://console.cloud.tencent.com/cam/capi

  • SecretId
  • SecretKey

利用腾讯云对象存储cos支持上传图片_java_05

4、blog-api代码修改

  • NBlog-master\blog-api\src\main\java\top\naccl\util\upload下增加工具类TencentCOSUtil.java 具体代码:
package top.naccl.util.upload;
  import com.qcloud.cos.COSClient;
  import com.qcloud.cos.ClientConfig;
  import com.qcloud.cos.auth.BasicCOSCredentials;
  import com.qcloud.cos.auth.COSCredentials; 
  import com.qcloud.cos.http.HttpProtocol;
  import com.qcloud.cos.model.ObjectMetadata;
  import com.qcloud.cos.model.PutObjectResult;
  import com.qcloud.cos.region.Region;
  import org.springframework.stereotype.Component;
  import org.springframework.web.multipart.MultipartFile;

  import java.io.InputStream;
  import java.net.URL;
  import java.util.UUID;
  //交给IOC容器管理
  @Component
  public class TencentCOSUtil {

    // COS的SecretId
    private static String secretId = "xxxxxxxxxxxxxx";
    // COS的SecretKey
    private static String secretKey = "xxxxxxxxxxxxxxxxxx";
    //文件上传后访问路径的根路径,后面要最佳文件名字与类型,最后面的/不要忘了
    private static String rootSrc = "xxxxxxxxxxxxxxxxxx/";
    //上传的存储桶的地域,可参考根路径https://qq-test-1303******.cos.地域.,此参数在COS的后台能查询。
    private static String bucketAddr = "ap-beijing";
    //存储桶的名字,是自己在存储空间自己创建的,我创建的名字是:qq-test-1303******
    private static String bucketName = "xxxxxxxxxxxxxxxxx";

    /**
     * 1.调用静态方法getCosClient()就会获得COSClient实例
     * 2.本方法根据永久密钥初始化 COSClient的,官方是不推荐,官方推荐使用临时密钥,是可以限制密钥使用权限,创建cred时有些区别
     *
     * @return COSClient实例
     */
    private static COSClient getCosClient() {
        // 1 初始化用户身份信息(secretId, secretKey)。
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2.1 设置存储桶的地域(上文获得)
        Region region = new Region(bucketAddr);
        ClientConfig clientConfig = new ClientConfig(region);
        // 2.2 使用https协议传输
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
        // 返回COS客户端
        return cosClient;
    }

    /**
     * 只要调用静态方法upLoadFile(MultipartFile multipartFile)就可以获取上传后文件的全路径
     *
     * @param file
     * @return 返回文件的浏览全路径
     */
    public static String upLoadFile(MultipartFile file) {
        try {
            // 获取上传的文件的输入流
            InputStream inputStream = file.getInputStream();

            // 避免文件覆盖,获取文件的原始名称,如123.jpg,然后通过截取获得文件的后缀,也就是文件的类型
            String originalFilename = file.getOriginalFilename();
            //获取文件的类型
            String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
            //使用UUID工具  创建唯一名称,放置文件重名被覆盖,在拼接上上命令获取的文件类型
            String fileName = UUID.randomUUID().toString() + fileType;
            // 指定文件上传到 COS 上的路径,即对象键。最终文件会传到存储桶名字中的images文件夹下的fileName名字
            String key = "images/" + fileName;
            // 创建上传Object的Metadata
            ObjectMetadata objectMetadata = new ObjectMetadata();
            // - 使用输入流存储,需要设置请求长度
            objectMetadata.setContentLength(inputStream.available());
            // - 设置缓存
            objectMetadata.setCacheControl("no-cache");
            // - 设置Content-Type
            objectMetadata.setContentType(fileType);
            //上传文件
            PutObjectResult putResult = getCosClient().putObject(bucketName, key, inputStream, objectMetadata);
            // 创建文件的网络访问路径
            String url = rootSrc + key;
            //关闭 cosClient,并释放 HTTP 连接的后台管理线程
            getCosClient().shutdown();
            return url;

        } catch (Exception e) {
            e.printStackTrace();
            // 发生IO异常、COS连接异常等,返回空
            return null;
        }
    }
  }
  • NBlog-master\blog-api\src\main\java\top\naccl\controller\admin\BlogAdminController.java下增加函数upload
/**
	 * 上传图片--swz
	 * 腾讯云cos
	 */
	@PostMapping("/upload")
	public Result upload(MultipartFile image) {
		//log.info("正在上传,文件名{}",image.getOriginalFilename());
		String url = tencentCOSUtil.upLoadFile(image);
		//System.out.println(url);
		//log.info("文件的Url:{}",url);

		return Result.ok(url);

	}

5、重新打包管理端blog-cms以及后台blog-api

参考:个人博客部署过程记录

6、axios发送请求的错误记录

  • 正确示例 增加uploadPic方法
//swz 上传图片
  export function uploadPic(formdata) {
	return axios({
		url: 'upload',
		method: 'POST',
		Headers: {
			'Content-Type': 'multipart/form-data'
		},
  		data: formdata
  	})
  }
  • 错误示例 增加uploadPic方法
//swz 上传图片
   export function uploadPic(formdata)
  {
      return axios(
      {
          url: 'upload',
          method: 'POST',
          Headers:
          {
              'Content-Type': 'multipart/form-data'
          },
          data:
          {
              ..formdata
          }
      })
  }

分析: 1、{...blog } 是一种对象展开语法(Object Spread Syntax)。当你在 axios 的请求配置里使用 data: {...blog } 时,通常意味着你要将 blog 对象里的所有属性及其对应的值提取出来,作为请求体数据发送出去。 2、data: formData这种用法通常用于发送表单数据。FormData是一个用于构建表单数据的 JavaScript 对象,它可以方便地将表单中的键值对(包括文件等)组合起来,然后通过axios发送到服务器。 3、因为上面我定义的formData,var formdata = new FormData();,默认就是表单了,所以使用第一种方法。