| 
 | 
 
springboot中转存储,比如客户访问A服务器上传,再从A服务器转存到B服务器,字节流byte[]方式上传 
好的,如果要在  `transferFileToBServer`  方法中同样使用字节流( `byte[]` )进行转存,可以对代码进行如下修改。我们将把文件的字节流直接传递给 B 服务器,而不是先将其写入文件。 
 ### 1. 文件上传到 A 服务器 
这个部分与之前的代码相同,接收字节流并保存到本地。 
- import org.springframework.web.bind.annotation.*;
 
 - import java.io.FileOutputStream;
 
 - import java.io.IOException;
 
 -  @RestController
 
 - @RequestMapping("/upload")
 
 - public class FileUploadController {
 
 -     @PostMapping
 
 -     public String handleFileUpload(@RequestBody byte[] fileBytes) {
 
 -         // 定义保存文件的路径
 
 -         String filePath = "/path/to/save/uploaded_file"; // 可以根据需要动态命名
 
 -         try {
 
 -             // 将字节数组写入文件
 
 -             try (FileOutputStream fos = new FileOutputStream(filePath)) {
 
 -                 fos.write(fileBytes);
 
 -             }
 
 -             // 调用转存方法
 
 -             transferFileToBServer(fileBytes); // 直接传递字节数组
 
 -             return "File uploaded successfully!";
 
 -         } catch (IOException e) {
 
 -             e.printStackTrace();
 
 -             return "File upload failed!";
 
 -         }
 
 -     }
 
 -      private void transferFileToBServer(byte[] fileBytes) {
 
 -         // 这里实现将文件转存到 B 服务器的逻辑
 
 -     }
 
 - }
 
  复制代码 
 
### 2. 转存文件到 B 服务器 
在  `transferFileToBServer`  方法中,我们直接使用传递的字节数组进行转存。 
- import org.springframework.beans.factory.annotation.Autowired;
 
 - import org.springframework.core.io.ByteArrayResource;
 
 - import org.springframework.http.HttpEntity;
 
 - import org.springframework.http.HttpHeaders;
 
 - import org.springframework.http.HttpMethod;
 
 - import org.springframework.http.ResponseEntity;
 
 - import org.springframework.stereotype.Service;
 
 - import org.springframework.web.client.RestTemplate;
 
 -  @Service
 
 - public class FileTransferService {
 
 -     @Autowired
 
 -     private RestTemplate restTemplate;
 
 -      public void transferFileToBServer(byte[] fileBytes) {
 
 -         // 创建 ByteArrayResource
 
 -         ByteArrayResource resource = new ByteArrayResource(fileBytes) {
 
 -             @Override
 
 -             public String getFilename() {
 
 -                 return "uploaded_file"; // 设置文件名
 
 -             }
 
 -         };
 
 -          // 设置请求头
 
 -         HttpHeaders headers = new HttpHeaders();
 
 -         headers.add("Content-Type", "application/octet-stream");
 
 -          // 创建请求实体
 
 -         HttpEntity<ByteArrayResource> requestEntity = new HttpEntity<>(resource, headers);
 
 -          // 发送 POST 请求到 B 服务器
 
 -         String bServerUrl = "http://B_SERVER_URL/upload"; // 替换为 B 服务器的 URL
 
 -         ResponseEntity<String> response = restTemplate.exchange(bServerUrl, HttpMethod.POST, requestEntity, String.class);
 
 -          // 处理响应
 
 -         if (response.getStatusCode().is2xxSuccessful()) {
 
 -             System.out.println("File transferred to B server successfully!");
 
 -         } else {
 
 -             System.out.println("Failed to transfer file to B server.");
 
 -         }
 
 -     }
 
 - }
 
  复制代码 
 
### 3. 配置 RestTemplate 
 `RestTemplate`  的配置部分与之前相同。 
- import org.springframework.context.annotation.Bean;
 
 - import org.springframework.context.annotation.Configuration;
 
 - import org.springframework.web.client.RestTemplate;
 
 -  @Configuration
 
 - public class AppConfig {
 
 -     @Bean
 
 -     public RestTemplate restTemplate() {
 
 -         return new RestTemplate();
 
 -     }
 
 - }
 
  复制代码 
 
### 总结 
1. 在 A 服务器上实现接收字节流的接口,并将字节数组写入文件。 
2. 直接将字节流传递给  `transferFileToBServer`  方法,并在该方法中将字节流转存到 B 服务器。 
3. 确保 B 服务器有相应的接口来接收字节流。 
 这样就实现了将文件作为字节流上传和转存的功能。 
 
 
  
 
 
下面是如何在 B 服务器上接收字节流并将其保存到硬盘的示例代码。我们将创建一个新的控制器来处理 B 服务器的文件上传请求。 
 ### 1. 创建 B 服务器的文件接收接口 
 在 B 服务器上,你可以创建一个控制器来接收字节流并将其保存到硬盘。以下是一个简单的示例: 
- import org.springframework.web.bind.annotation.*;
 
 - import java.io.File;
 
 - import java.io.FileOutputStream;
 
 - import java.io.IOException;
 
 -  @RestController
 
 - @RequestMapping("/upload")
 
 - public class FileReceiveController {
 
 -      @PostMapping
 
 -     public String handleFileReceive(@RequestBody byte[] fileBytes) {
 
 -         // 定义保存文件的路径
 
 -         String filePath = "/path/to/save/received_file"; // 可以根据需要动态命名
 
 -          try (FileOutputStream fos = new FileOutputStream(new File(filePath))) {
 
 -             // 将字节数组写入文件
 
 -             fos.write(fileBytes);
 
 -             return "File received and saved successfully!";
 
 -         } catch (IOException e) {
 
 -             e.printStackTrace();
 
 -             return "Failed to save the file!";
 
 -         }
 
 -     }
 
 - }
 
  复制代码 
 
### 2. 解释代码 
 - ** `@RestController` **:标记这个类为 REST 控制器,能够处理 HTTP 请求。 
- **`@RequestMapping("/upload") `**:指定请求的基本路径。 
- **` @PostMapping `**:处理 POST 请求。 
- **` @RequestBody byte[] fileBytes `**:将请求体中的字节流映射到 ` fileBytes ` 参数。 
- **` FileOutputStream `**:用于将字节数组写入指定的文件路径。 
- **异常处理**:捕获 ` IOException`,并打印错误信息。 
 ### 3. 完整的流程 
 1. **A 服务器**:接收文件上传,将字节流保存到硬盘,并调用 B 服务器的接口,将字节流转存。 
2. **B 服务器**:接收字节流并将其保存到硬盘。 
 确保 B 服务器的路径有写入权限,并根据需要调整文件命名逻辑。 
 
  
 
 
要在 A 服务器上获取 B 服务器上传成功后的返回值,可以在调用 B 服务器的接口时,解析  `ResponseEntity`  对象中的响应内容。以下是如何实现的步骤: 
 ### 1. 修改 A 服务器的转存方法 
 在 A 服务器的  `transferFileToBServer`  方法中,我们可以获取 B 服务器的响应并处理它。 
- import org.springframework.beans.factory.annotation.Autowired;
 
 - import org.springframework.core.io.ByteArrayResource;
 
 - import org.springframework.http.HttpEntity;
 
 - import org.springframework.http.HttpHeaders;
 
 - import org.springframework.http.HttpMethod;
 
 - import org.springframework.http.ResponseEntity;
 
 - import org.springframework.stereotype.Service;
 
 - import org.springframework.web.client.RestTemplate;
 
 -  @Service
 
 - public class FileTransferService {
 
 -     @Autowired
 
 -     private RestTemplate restTemplate;
 
 -      public void transferFileToBServer(byte[] fileBytes) {
 
 -         // 创建 ByteArrayResource
 
 -         ByteArrayResource resource = new ByteArrayResource(fileBytes) {
 
 -             @Override
 
 -             public String getFilename() {
 
 -                 return "uploaded_file"; // 设置文件名
 
 -             }
 
 -         };
 
 -          // 设置请求头
 
 -         HttpHeaders headers = new HttpHeaders();
 
 -         headers.add("Content-Type", "application/octet-stream");
 
 -          // 创建请求实体
 
 -         HttpEntity<ByteArrayResource> requestEntity = new HttpEntity<>(resource, headers);
 
 -          // 发送 POST 请求到 B 服务器
 
 -         String bServerUrl = "http://B_SERVER_URL/upload"; // 替换为 B 服务器的 URL
 
 -         ResponseEntity<String> response = restTemplate.exchange(bServerUrl, HttpMethod.POST, requestEntity, String.class);
 
 -          // 处理响应
 
 -         if (response.getStatusCode().is2xxSuccessful()) {
 
 -             String responseBody = response.getBody(); // 获取 B 服务器的响应内容
 
 -             System.out.println("File transferred to B server successfully! Response: " + responseBody);
 
 -         } else {
 
 -             System.out.println("Failed to transfer file to B server. Status code: " + response.getStatusCode());
 
 -         }
 
 -     }
 
 - }
 
  复制代码 
 
### 2. 解释代码 
 - ** `ResponseEntity<String> response` **: 发送请求后,接收 B 服务器的响应。 
- ** `response.getBody()` **: 获取 B 服务器返回的响应内容。 
- ** `System.out.println(...)` **: 打印 B 服务器的响应内容。 
 ### 3. 完整流程 
 1. **A 服务器**: 接收文件上传,保存字节流,并调用 B 服务器的接口转存字节流。 
2. **B 服务器**: 接收字节流并保存到硬盘,返回上传成功的消息。 
3. **A 服务器**: 解析 B 服务器的响应,获取上传成功的消息并进行相应处理。 
 通过这种方式,A 服务器可以获取 B 服务器的上传成功后的返回值。 
 
 |   
 
 
 
 |