Java Springboot如何基于图片生成下载链接

现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式。

现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载。由于前端存在跨域问题,所以图片下载由后台接口完成。

首先编写文件下载工具类:

import java.net.URL;
import java.net.MalformedURLException;
import org.apache.commons.io.FileUtils;

public class FileDownloadUtil {
/**
   * 下载文件---返回下载后的文件存储路径
   *
   * @param url 文件路径
  * @param dir 目标存储目录
  * @param fileName 存储文件名
  * @return
  */
  public static void downloadHttpUrl(String url, String dir, String fileName) throws BusinessException {
    try {
    URL httpurl = new URL(url);
    File dirfile = new File(dir);
      if (!dirfile.exists()) {
        dirfile.mkdirs();
      }
      FileUtils.copyURLToFile(httpurl, new File(dir+fileName));
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();26     }
  }

  public static boolean deleteFile(File file) {
    if (file.exists()) {
      return file.delete();
    }
    return false;
  }
}

单张图片下载

Controller层接口:

import org.apache.commons.lang.StringUtils;
import java.io.*;

protected HttpServletResponse response;

/**
   * 单张图片下载
   *
   * @param url 要下载的图片url
   * @author: nemowang
   */
  @ApiImplicitParams({
      @ApiImplicitParam(name = "url", value = "图片url", required = true, dataType = "String", paramType = "query"),
  })
  @ApiOperation(value = "单张图片下载", notes = "单张图片下载")
  @RequestMapping(value = "/downloadPicture", method = RequestMethod.GET)
  public void downloadPicture(String url) {

    // 拼接完整图片路径。这里填写图片链接
    String urlPath = "";

    // 获取图片文件后缀名
    String postfix = "." + StringUtils.substringAfterLast(url, ".");

    // 获取当前类的所在项目路径
    File directory = new File("");
    String courseFile;

    String srcPath;
    File srcFile = null;
    FileInputStream fileInputStream = null;
    InputStream fis = null;
    OutputStream out = null;
    try {
      courseFile = directory.getCanonicalPath();
      String fileName = "\\" + StringUtil.getUUID() + postfix;
      // 下载文件
      FileDownloadUtil.downloadHttpUrl(urlPath, courseFile, fileName);

      srcPath = courseFile + fileName;
      srcFile = new File(srcPath);

      fileInputStream = new FileInputStream(srcPath);
      fis = new BufferedInputStream(fileInputStream);
      byte[] buffer = new byte[fis.available()];
      fis.read(buffer);

      response.setContentType("application/octet-stream");
      response.setHeader("Content-disposition", "attachment;filename=" + fileName);
      out = response.getOutputStream();
      out.write(buffer);
      out.flush();
      out.close();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (fileInputStream != null) {
          fileInputStream.close();
        }
        if (fis != null) {
          fis.close();
        }
        if (out != null) {
          out.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

    // 删除中间文件
    if (srcFile != null) {
      System.out.println(FileDownloadUtil.deleteFile(srcFile));
    }
  }

因为是GET请求,所以直接拼接接口路由+参数,用浏览器打开就能弹出下载。

至此单张图片下载接口结束。

多张图片打包下载

Controller层接口:

/**
   * 图片打包下载
   */
  @ApiImplicitParams({
      @ApiImplicitParam(name = "urls", value = "图片url列表", required = true, dataType = "List", paramType = "query"),
  })
  @ApiOperation(value = "图片打包下载", notes = "图片打包下载")
  @RequestMapping(value = "/downloadPictureList", method = RequestMethod.GET)
  public void downloadPictureList(List urls) {
    List<String> fileNameList = new ArrayList<>();

    for (int i = 0; i < urls.size(); i++) {
      // 获取文件名
      fileNameList.add(StringUtils.substringAfterLast(urls.get(i), "/"));

      // 拼接完整图片路径
      urls.set(i, DOMAIN + urls.get(i));
    }

    // 获取当前类的所在项目路径
    File directory = new File("");
    String courseFile;

    String srcPath;
    File srcFile = null;

    // 要打包的文件列表
    List<File> fileList = new ArrayList<>();

    ZipOutputStream zos = null;
    OutputStream out = null;
    try {
      courseFile = directory.getCanonicalPath();

      // 下载文件
      for (int i = 0; i < urls.size(); i++) {
        String fileName = "\\" + fileNameList.get(i);
        FileDownloadUtil.downloadHttpUrl(urls.get(i), courseFile, fileName);
        srcPath = courseFile + fileName;
        srcFile = new File(srcPath);
        fileList.add(srcFile);
      }

      long start = System.currentTimeMillis();

      response.setContentType("application/x-zip-compressed");
      response.setHeader("Content-disposition", "attachment;filename=" + StringUtil.getUUID() + ".zip");
      out = response.getOutputStream();
      zos = new ZipOutputStream(out);
      for (File file : fileList) {
        byte[] buf = new byte[BUFFER_SIZE];
        zos.putNextEntry(new ZipEntry(file.getName()));
        int len;
        FileInputStream in = new FileInputStream(file);
        while ((len = in.read(buf)) != -1) {
          zos.write(buf, 0, len);
        }
        zos.closeEntry();
        in.close();
      }
      long end = System.currentTimeMillis();
      System.out.println("压缩完成,耗时:" + (end - start) + " ms");

      out.flush();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (Exception e) {
        throw new RuntimeException("zip error from ZipUtils", e);
    } finally {
      if (zos != null) {
        try {
          zos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if (out != null) {
        try {
          zos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }

    // 删除中间文件
    if (fileList != null) {
      for (File file : fileList) {
        System.out.println(FileDownloadUtil.deleteFile(file));
      }
    }
  }

同样是GET请求,所以也是拼接接口路由+参数,用浏览器打开就能弹出下载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java(springboot) 读取txt文本内容代码实例

    这篇文章主要介绍了Java(springboot) 读取txt文本内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 public class TxtTest { private static final Logger logger = LoggerFactory.getLogger(TxtTest.class); public static String readTxt(File file) throws IOExcepti

  • Springboot实现Java阿里短信发送代码实例

    阿里云短信服务还是非常好的,接口稳定,同时还提供SDK,使得企业的接入该服务更加方便.下面来看看阿里云提供的发短信的java实例代码吧 1.接口TestController import java.util.Random; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import

  • 浅谈Java(SpringBoot)基于zookeeper的分布式锁实现

    通过zookeeper实现分布式锁 1.创建zookeeper的client 首先通过CuratorFrameworkFactory创建一个连接zookeeper的连接CuratorFramework client public class CuratorFactoryBean implements FactoryBean<CuratorFramework>, InitializingBean, DisposableBean { private static final Logger LOGG

  • java通过Idea远程一键部署springboot到Docker详解

    一.开发前准备 1. Docker的安装可以参考https://docs.docker.com/install/ 2. 配置docker远程连接端口 vi /usr/lib/systemd/system/docker.service 找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375,如下图所示 3. 重启docker systemctl daemon-reload systemctl start docker 4. 开放端口 firewall-cmd --zon

  • 基于javamelody监控springboot项目过程详解

    JavaMelody是用来在QA和实际运行生产环境中监控Java或Java EE应用程序服务器的一个开源框架.它不是一个工具来模拟来自用户的请求,而是一个测量和计算用户在实际操作中应用程序的使用情况的工具,并以图表的形式显示,图表可以按天,周,月,年或自定义时间段查看. JavaMelody基础的监控包括Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请求.jsp页面与业务接口方法(EJB3.Spring. Guice)的执行数量,平均执行时

  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,docker的镜像也原来越丰富,未来各种企业级的完整解决方案都可以直接通过下载镜像拿来即用.因此docker变得越来越重要. 本文目的 本文通过一个项目实例来介绍如果通过docker对外接口来实现对docker容器的管理和监控. 应用场景: 对服务器资源池通过docker进行统一管理,按需分配资源和创建容器,达到资源最大化利

  • java springboot poi 从controller 接收不同类型excel 文件处理

    根据poi接收controller层的excel文件导入 可使用后缀名xls或xlsx格式的excel. 1.pom引入 <!-- poi 操作Excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <d

  • Java Springboot如何基于图片生成下载链接

    现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题,所以图片下载由后台接口完成. 首先编写文件下载工具类: import java.net.URL; import java.net.MalformedURLException; import org.apache.commons.io.FileUtils; public class FileDownl

  • java获取百度网盘真实下载链接的方法

    本文实例讲述了java获取百度网盘真实下载链接的方法.分享给大家供大家参考.具体如下: 目前还存在一个问题,同一ip在获取3次以后会出现验证码,会获取失败,感兴趣的朋友对此可以加以完善. 返回的List<Map<String, Object>>  中的map包含:fileName( 文件名),url(实链地址) HttpRequest.java如下: import java.io.BufferedReader; import java.io.IOException; import

  • java+MongoDB实现存图片、下载图片的方法示例

    本文实例讲述了java+MongoDB实现存图片.下载图片的方法.分享给大家供大家参考,具体如下: 1.存图片 demo:将某个文件存到mongoDB,这个file可以通过前台参数传入,我这里直接将D://test.png存到mongoDB @RequestMapping("/addFile") @ResponseBody public String addFile(){ MongoClient client = new MongoClient("127.0.0.1"

  • Java爬虫抓取视频网站下载链接

    本篇文章抓取目标网站的链接的基础上,进一步提高难度,抓取目标页面上我们所需要的内容并保存在数据库中.这里的测试案例选用了一个我常用的电影下载网站(http://www.80s.la/).本来是想抓取网站上的所有电影的下载链接,后来感觉需要的时间太长,因此改成了抓取2015年电影的下载链接. 一 原理简介 其实原理都跟第一篇文章差不多,不同的是鉴于这个网站的分类列表实在太多,如果不对这些标签加以取舍的话,需要花费的时间难以想象. 分类链接和标签链接都不要,不通过这些链接去爬取其他页面,只通过页底的

  • java实现随机验证码图片生成

    本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下 1.controller /** * 获取随机数验证码图片 * * @param request HttpServletRequest * @param response HttpServletResponse */ @GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) pub

  • java springboot的概述、特点与构建介绍

    目录 回顾Spring spring的优点: Spring Boot概述 SpringBoot特点 SpringBoot的核心功能 SpringBoot开发环境构建 回顾Spring springBoot是集成了spring的优点,优化了spring配置的一款框架,他的学习离不开spring,我们先回顾spring spring的优点: 优点: 1.开源,轻量级,非侵入式的一站式框架,简化企业级应用开发.   2.控制反转(IOC),依赖注入(DI)降低了组件之间的耦合性,实现了软件各层之间的解

  • 基于Java SpringBoot的前后端分离信息管理系统的设计和实现

    目录 前言 视频演示 主要功能说明 功能截图 主要代码实现 主要数据表设计 前言 当今社会,随着科学技术的发展,以及市场经济的多元化,使人才的流动速度大大增加,因此也对党建工作的管理层面工作带来了空前且复杂的挑战, 从而使得如何高效的开展管理党建工作成为了亟待解决的问题.为此将高速发展的信息科学技术引入到党建工作管理的应用中,力求合理有效的提升全面各项工作的进展,实现以人为本的科学发展思想和意识,是一种高效可实现的方法. Java作为一种面向对象的.可以撰写跨平台应用软件的程序设计语言,其技术具

  • 基于jfreechart生成曲线、柱状等图片并展示到JSP

    虽然现在JS做报表和图形展示已经非常普遍和漂亮了,但是不能忽略有jfreechart 这样一种东西! 这些翻阅资料,在看以前写的示例时发现了关于jfreechart 的简单示例,不管怎样发上来分享一下! 这个示例使用JSP和Servlet做后台和前台展示,下面有源代码可以直接运行! 生产线型趋势图: package com.xidian.servlet; import java.awt.Color; import java.awt.Font; import java.io.*; import j

  • 完整音乐播放系统基于Java Springboot + Vue + MyBatis

    目录 摘要 主要设计 功能设计 主要技术 功能截图 用户端首页 登录注册 歌单信息 歌手信息 我的音乐 评论点赞 管理员端 首页 用户管理 歌手管理 歌单管理 部分代码 数据库设计 用户表 评论表 收藏表 歌手歌曲表 歌手表 项目总结 视频演示: springboot+vue音乐网站 摘要 网络技术以及计算机的发展,网友们对网络的要求也日益长高,平常在网上听话用一大堆下载软件下载下来也要管理,又占空间,比如那流行歌曲,下载了听了又要删很不方便·而网络音乐库的实现改变了这一状况.它本身就是一个数字

  • 基于Java Springboot + Vue + MyBatis实现音乐播放系统

    目录 摘要 主要设计 功能设计 主要技术 功能截图 用户端首页 登录注册 歌单信息 歌手信息 我的音乐 评论点赞 管理员端 首页 用户管理 歌手管理 歌单管理 部分代码 数据库设计 用户表 评论表 收藏表 歌手歌曲表 歌手表 项目总结 视频演示: springboot+vue音乐网站 摘要 网络技术以及计算机的发展,网友们对网络的要求也日益长高,平常在网上听话用一大堆下载软件下载下来也要管理,又占空间,比如那流行歌曲,下载了听了又要删很不方便·而网络音乐库的实现改变了这一状况.它本身就是一个数字

随机推荐