springboot实现网络图片转存的临时文件后上传腾讯云cos

有时复制一张图片url,想转存到自己的腾讯云cos保存。

实现思路是:先将网络图片url保存到当前项目一个临时文件夹里,然后发送腾讯云cos对象存储,返回一个url,最后,删除该临时文件图片。

测试结果

 1. util实现类

package com.xxxx.util;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

public class ImageUrlUtil {

    /**
     * 从网络url中下载文件图片
     */
    public static String downLoadByUrl(String imgUrl) throws IOException {
        URL url = new URL(imgUrl);
        //生成唯一的文件名
        String fileName = generateUniqueFileName();

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //设置超时间为3秒
        conn.setConnectTimeout(5*1000);
        //防止屏蔽程序抓取而返回403错误
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
        //conn.setRequestProperty("User-Agent", "Mozilla/5.0");
        //得到输入流
        InputStream inputStream = conn.getInputStream();
        //获取自己数组
        byte[] getData = readInputStream(inputStream);
        //获取项目根目录地址
        String propertiesFile = System.getProperty("user.dir")+ "/src/main/resources/static";
        //文件保存位置
        File saveDir = new File(propertiesFile);
        if(!saveDir.exists()) {
            saveDir.mkdir();
        }
        File file = new File(saveDir + File.separator + fileName);
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(getData);
        if(fos != null) {
            fos.close();
        }
        if(inputStream != null) {
            inputStream.close();
        }
        return propertiesFile + "/" + fileName;
    }

    /**
     * 从输入流中获取字节数组
     */
    public static byte[] readInputStream(InputStream inputStream) throws IOException {
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度,如果为-1,代表全部读取完毕
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //使用一个输入流从buffer里把数据读取出来
        while ((len = inputStream.read(buffer)) != -1) {
            //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
            bos.write(buffer, 0, len);
        }
        //关闭输入流
        bos.close();
        //把outStream里的数据写入内存
        return bos.toByteArray();
    }

    /**
     * // 使用UUID生成一个唯一的文件名
     * @return
     */
    private static String generateUniqueFileName() {

        return UUID.randomUUID().toString() + ".jpg";
    }

    //删除临时文件
    public static Boolean deleteImage(String localFilePath) {
        File fileToDelete = new File(localFilePath);
        if(fileToDelete.exists()) {
            if(fileToDelete.delete()) {
                //本地临时文件删除成功
                return true;
            } else {
                //本地临时文件删除失败
                return false;
            }
        } else {
            //本地临时文件不存在
            return false;
        }
    }
}

2. controller类

@GetMapping("/upload/image")
    public ApiRestResponse uploadImage(String url) {
        HashMap<String, Object> map = new HashMap();
        try {
            //得到一个保存在当前项目的临时文件
            String filePath = ImageUrlUtil.downLoadByUrl(url);
 
            File fileExists = new File(filePath);
            //判断源文件是否存在
            if (fileExists.exists()) {
                //上传到腾讯云 返回url
                String imageUrl = CosFileUtil.uploadImage(filePath);

                map.put("originalSrc", url);//源图片地址
                map.put("imageUrl", imageUrl);//腾讯云 图片地址
            } else {
                return ApiRestResponse.error(400, "图片上传失败~");
            }
            //删除临时文件
            ImageUrlUtil.deleteImage(filePath);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return ApiRestResponse.success(map);
    }

感谢大佬分享的帖子:

java 从网络中下载图片保存到本地_一位热心网友的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Spring Boot中的MultipartFile来实现文件上传。 首先在pom.xml中添加依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 然后编写上传文件的工具类: ```java import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; @Component public class FileUploadUtil { /** * 上传文件 * * @param file 文件 * @param filePath 文件路径 * @param fileName 文件名 * @return 成功返回文件路径,失败返回null */ public String upload(MultipartFile file, String filePath, String fileName) { // 判断文件是否为空 if (file.isEmpty()) { return null; } // 创建目录 File dir = new File(filePath); if (!dir.exists()) { dir.mkdirs(); } // 上传文件 File dest = new File(filePath + fileName); try { file.transferTo(dest); return dest.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); return null; } } } ``` 其中,MultipartFile是Spring Boot中封装的文件上传类型,通过调用transferTo方法将上传的文件转存到指定的目录中。 使用示例: ```java @RestController public class FileUploadController { @Autowired private FileUploadUtil fileUploadUtil; @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) { String filePath = "D:/files/"; String fileName = file.getOriginalFilename(); String result = fileUploadUtil.upload(file, filePath, fileName); if (result == null) { return "上传失败"; } else { return "上传成功,文件路径为:" + result; } } } ``` 其中,@RequestParam注解用于接收上传的文件,上传成功后返回文件的路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值