首页 > 其他分享 >接口间传输文件流

接口间传输文件流

时间:2023-06-17 22:34:56浏览次数:38  
标签:文件 boot 接口 fileName 传输 springframework org import httpUrlConnection

1、业务背景

  外部服务请求文件信息,通过对外暴露的前置服务,请求到应用服务器上,应用服务器从文件存储平台下载文件,并返回文件流给外部服务。请求流程如下:

  

   这里我们做个简化,假设文件存储在了应用服务器中,前置服务、应用服务在同一台服务器上。

2、代码实现

2.1、pom依赖

 1  <parent>
 2         <groupId>org.springframework.boot</groupId>
 3         <artifactId>spring-boot-starter-parent</artifactId>
 4         <version>2.1.6.RELEASE</version>
 5     </parent>
 6     <dependencies>
 7         <dependency>
 8             <groupId>org.springframework.boot</groupId>
 9             <artifactId>spring-boot-starter-web</artifactId>
10         </dependency>
11         <dependency>
12             <groupId>org.springframework.boot</groupId>
13             <artifactId>spring-boot-starter-test</artifactId>
14         </dependency>
15         <dependency>
16             <groupId>org.apache.httpcomponents</groupId>
17             <artifactId>httpclient</artifactId>
18             <version>4.5.13</version>
19         </dependency>
25 
26         <!--    Java集合增强    -->
27         <dependency>
28             <groupId>commons-collections</groupId>
29             <artifactId>commons-collections</artifactId>
30             <version>3.2.2</version>
31         </dependency>
32         <!-- 通用工具包  -->
33         <dependency>
34             <groupId>org.apache.commons</groupId>
35             <artifactId>commons-lang3</artifactId>
36             <version>3.8.1</version>
37         </dependency>
38     </dependencies>

2.2、汇总实现

 1 import org.springframework.stereotype.Controller;
 2 import org.springframework.web.bind.annotation.PathVariable;
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import javax.servlet.ServletOutputStream;
 5 import javax.servlet.http.HttpServletResponse;
 6 import java.io.*;
 7 import java.net.HttpURLConnection;
 8 import java.net.URL;
 9 import java.net.URLConnection;
10 
11 
12 @Controller
13 public class FileStreamController {
14 
15     /**  前置服务的实现
16      *   前置服务接收获取文件请求
17      * @param fileName  文件名称
18      * @param resp      响应
19      * @throws Exception
20      */
21     @RequestMapping("/front/file/{fileName}")
22     public void getFile(@PathVariable("fileName") String fileName, HttpServletResponse resp) throws Exception {
23         // 应用服务地址
24         String appurl = "http://localhost:8085/download/" + fileName;
25 
26         int connectTimeOut = Integer.valueOf(30000);
27         int readTimeOut = Integer.valueOf(100) * 1000;
28 
29         HttpURLConnection httpUrlConnection = null;
30         URL url = null;
31         InputStream inStrm = null;
32         try{
33             url = new URL(appurl);
34             URLConnection rulConnection = url.openConnection();
35             // 设置连接超时时间
36             rulConnection.setConnectTimeout(connectTimeOut);
37             // 设置读超时时间
38             rulConnection.setReadTimeout(readTimeOut);
39             httpUrlConnection = (HttpURLConnection) rulConnection;
40             // 开启向服务器发送信息标志
41             httpUrlConnection.setDoOutput(true);
42             // 开启从服务器获取信息标志
43             httpUrlConnection.setDoInput(true);
44             // 关闭关村
45             httpUrlConnection.setUseCaches(false);
46             // 请求类型
47             httpUrlConnection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
48             // 请求方式
49             httpUrlConnection.setRequestMethod("POST".toUpperCase());
50 
51             // 获取应用服务的输入流
52             inStrm = httpUrlConnection.getInputStream();
53 
54             //设置响应头类型
55             resp.setContentType("multipart/form-data");
56             //设置响应头打开方式,并设置下载时的文件名称
57             resp.setHeader("content-disposition","attachment;filename=" + fileName);
58             // 获取响应的输出流,输出到浏览器
59             ServletOutputStream sos = resp.getOutputStream();
60             byte[] buffer = new byte[1024];
61             int length = 0;
62             while((length = inStrm.read(buffer)) != -1){
63                 sos.write(buffer,0,length);
64                 sos.flush();
65             }
66             sos.close();
67             inStrm.close();
68         }catch (Exception ex) {
69             ex.printStackTrace();
70         }
71     }
72 
73     /**  应用服务的实现
74      *   应用服务获取文件
75      * @param fileName 文件名称
76      * @param response 响应
77      * @return
78      * @throws Exception
79      */
80     @RequestMapping("/download/{fileName}")
81     public HttpServletResponse downloadFile(@PathVariable("fileName") String fileName, HttpServletResponse response) throws Exception {
82         // 指定文件地址,这里假设目标文件存储在D盘
83         String filePath = "D:\\" + fileName;
84         // 获取文件输入流
85         FileInputStream inputStream = new FileInputStream(new File(filePath));
86         // 将文件流传输到前置服务
87         byte[] buffer = new byte[1024];
88         int len;
89         ServletOutputStream outputStream = response.getOutputStream();
90         while ((len = inputStream.read(buffer)) != -1) {
91             outputStream.write(buffer, 0 , len);
92             outputStream.flush();
93         }
94         return response;
95 
96     }
97
98 }

2.3、配置文件及启动类

2.3.1、配置文件

server:
  port: 8085

2.3.2、启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FileStreamApplication {
    public static void main(String[] args) {
        SpringApplication.run(FileStreamApplication.class, args);
    }
}

3、测试

3.1、在D盘上准备好要下载的文件

  这里我在D盘上准备了要下载的Test压缩包Test.tar.gz。

    

3.2、启动服务浏览器请求前置服务下载文件

    

  文件下载完成。

 

标签:文件,boot,接口,fileName,传输,springframework,org,import,httpUrlConnection
From: https://www.cnblogs.com/RunningSnails/p/17488339.html

相关文章

  • 十 区块量化 通用文件 微信接口
    1、首先申请开通微信企业号2、新建一个应用3、把应用id、企业Id、Secret替换以下winxin.py文件 #-*-coding:utf-8-*-importrequestsimportjsonimporttimeimportsysAppId="1000001"#应用idCropID='wx00000000000000'#企业IdSecret='S_000000000000000000......
  • Java_Base7之接口和抽象类、集合类ArrayList、HashSet、HashMap
    一、接口和抽象类(了解)接口:规则,规范行为。只能有抽象方法,一个类可以同时实现多个接口,必须重写所有抽象方法。 接口与接口是继承,接口与类是实现。接口是对继承的补充。 interfaceimplements定义一个接口publicinterfaceInter{ //默认修饰符publicabstract可以省略 pu......
  • python--python脚本中保存处理后的音频文件到指定文件夹时报错permission denied 的问
    问题1:自己编写的python脚本中,将处理后的音频文件保存到指定的文件夹(用到了pydub库对音频文件进行处理),但保存处理后的文件到指定文件夹时,会报错permissiondenied的错误,如下截图解决思路:一开始网上查资料,基本上都是说文件夹没有读写权限,让设置文件夹权限等操作,但设置了之后还是......
  • go 接口循环方法
    typeCallinterface{String()string}typeCnstruct{}typeEnstruct{}funcNewcn()Call{return&Cn{}}func(c*Cn)String()string{b,_:=json.Marshal(c)fmt.Println(b)returnstring(b)}funcNewen()Call{return&En{}}func(e*E......
  • 八、区块量化 binance 合约操作文件
    新增cross_order.py文件#-*-coding:utf-8-*-importpandasaspdfrombinance.clientimportClientfrombinance.configimportapi_key,api_secretimporttimeclient=Client(api_key,api_secret)pd.set_option('expand_frame_repr',False) #交易对集合#symb......
  • 九、区块量化 binance 合约操作文件续
    defcreate_limit_order(symbol='EOSUSDT',side='BUY',positionside='LONG',ordtype='LIMIT',price=0,quantity='1',message=''):"""全仓合约市价下单@paramsymbol:......
  • Java-抽象与接口
    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。......
  • three.js 置换贴图 alpha贴图 的妙用 - 3D文字不引入字体文件
    实现将文字绘制到canvascanvas生成置换贴图alpha贴图将canvas转换成texture将texture贴到material修改shader将黑色背景区域去掉视频教程请移步b站canvas生成贴图classCanvas{canvas:HTMLCanvasElement=document.createElement("canvas");protectedctx:CanvasRen......
  • python3---signify-验证PE文件证书
    python3---signify-验证PE文件证书keywords:验证签名signify可以用来查看和验证PE文件证书github地址:https://github.com/ralphje/signify安装模块:pipinstallsignify示例:fromsignify.authenticode.signed_peimportSignedPEFilewithopen("Everything.exe","rb"......
  • 深入理解API接口:连接应用程序的关键
    在当今数字化时代,应用程序的互联互通变得至关重要。而在应用程序之间进行通信和数据交换的核心工具就是API接口。无论是在移动应用、网站开发还是系统集成领域,了解和掌握API接口的原理和使用方法都是一项重要的技能。API,全称为应用程序编程接口(ApplicationProgrammingInterface......