Java后端通过图片URL获取图片并保存

Java后端通过图片URL获取图片并保存


工作中需要同步图片并保存下来,但第三方接口返回结果只能返回图片的绝对路径,于是需要通过url获取图片信息,先通过获取url获取图片的二进制流并转化为base64.

public static String image2Base64(String imgUrl) {
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;
        try{
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while( (len=is.read(buffer)) != -1 ){
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            // 对字节数组Base64编码
            return Base64Utils.encodeImage(outStream.toByteArray());
        }catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(is != null)
            {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outStream != null)
            {
                try {
                    outStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(httpUrl != null)
            {
                httpUrl.disconnect();
            }
        }
        return imgUrl;
    }
    /**
	 * 图片转字符串
	 * @param image
	 * @return
	 */
	public static String encodeImage(byte[] image){
		BASE64Encoder decoder = new BASE64Encoder();
		return replaceEnter(decoder.encode(image));
	}

	public static String replaceEnter(String str){
		String reg ="[\n-\r]";
		Pattern p = Pattern.compile(reg);
		Matcher m = p.matcher(str);
		return m.replaceAll("");
	}

在通过base64转换为image并保存到指定的路径,下面为Base64Util的代码

public static void base64ToImage(String path,String base64) {
		File file = null;
		BufferedOutputStream bos = null;
		java.io.FileOutputStream fos = null;
		try {
			byte[] bytes = Base64.getDecoder().decode(base64);
			file = new File(path);
			fos = new java.io.FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			bos.write(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

上面以百度图片为例:
在这里插入图片描述

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java后端获取前端图片可以通过以下步骤实现: 1. 前端将图片转换为Base64编码,并通过POST请求发送给后端。 2. 后端接收到请求后,读取POST请求中的Base64编码字符串。 3. 将Base64编码字符串转换为字节数组。 4. 将字节数组转换为图片格式,保存到本地或者存储到数据库中。 以下是一个简单的示例代码: 前端代码: ```html <input type="file" accept="image/*" onchange="readImage(this)"> <script> function readImage(input) { if (input.files && input.files[0]) { var reader = new FileReader(); reader.onload = function (e) { var image = e.target.result; //将图片转换为Base64编码,发送到后端 $.ajax({ type: "POST", url: "/uploadImage", data: { "image": image }, success: function (data) { alert("上传成功"); }, error: function (xhr, textStatus, error) { alert("上传失败:" + error); } }); }; reader.readAsDataURL(input.files[0]); } } </script> ``` 后端代码: ```java @PostMapping("/uploadImage") public String uploadImage(@RequestParam("image") String imageBase64) { //将Base64编码字符串转换为字节数组 byte[] imageBytes = Base64.getDecoder().decode(imageBase64.split(",")[1]); //将字节数组转换为图片格式 BufferedImage image = null; try { image = ImageIO.read(new ByteArrayInputStream(imageBytes)); } catch (IOException e) { e.printStackTrace(); } //保存图片到本地或者存储到数据库中 //... return "success"; } ``` 需要注意的是,在实际应用中,需要对上传的图片进行大小、格式等限制,以确保系统的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值