Springboo通过http请求下载文件到服务器

ops/2024/10/11 2:32:20/
http://www.w3.org/2000/svg" style="display: none;">

这个方法将直接处理从URL下载数据并将其保存到文件的整个过程。下面是一个这样的方法示例:

import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.HttpURLConnection;  
import java.net.URL;  public class Downloader {  public static void downloadAndSave(String urlString, String filePath) {  InputStream in = null;  try {  URL url = new URL(urlString);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setRequestMethod("GET");  connection.setUseCaches(false);  connection.setRequestProperty("Content-Type", "application/json"); // 或者其他适当的MIME类型,或者根据需求移除  connection.setConnectTimeout(60000);  connection.setReadTimeout(60000);  // 连接服务器  connection.connect();  // 检查响应码是否为200  if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {  in = connection.getInputStream();  // 使用try-with-resources来自动关闭OutputStream  try (OutputStream out = new FileOutputStream(filePath)) {  byte[] buffer = new byte[4096];  int bytesRead;  // 从输入流中读取数据,并写入到文件输出流中  while ((bytesRead = in.read(buffer)) != -1) {  out.write(buffer, 0, bytesRead);  }  }  // 注意:由于使用了try-with-resources,OutputStream会在这里自动关闭  // 但我们仍然需要确保InputStream在方法结束时被关闭  } else {  System.out.println("Failed to download file: HTTP error code " + connection.getResponseCode());  }  } catch (IOException e) {  e.printStackTrace();  } finally {  // 关闭InputStream  if (in != null) {  try {  in.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }  }  // 示例用法  public static void main(String[] args) {  String url = "http://example.com/somefile.txt";  String filePath = "downloaded_file.txt";  downloadAndSave(url, filePath);  }  
}

在这个downloadAndSave方法中,我们首先尝试从给定的URL下载数据。如果HTTP响应码为200(OK),我们就从连接中获取InputStream,并使用try-with-resources语句来自动关闭FileOutputStream,同时将数据从InputStream写入到文件中。无论操作成功与否,我们都会在finally块中关闭InputStream,以确保资源被正确释放。

请注意,我修改了setRequestProperty的键从"Charset"到"Content-Type",但通常对于GET请求来说,设置"Content-Type"并不是必需的,因为它是由请求体(对于GET请求来说,请求体是空的)的媒体类型决定的。然而,如果你正在向服务器发送POST或PUT请求,并包含请求体,那么设置正确的"Content-Type"就非常重要了。在这个例子中,我保留了它,但你可能想要根据实际需求进行调整或移除它。如果你只是想从服务器下载文件,那么通常不需要设置"Content-Type"。

实现文件下载并保存的功能,除了使用HttpURLConnection之外,还有其他几种常见的方法。以下是其中两种方法的示例:

  1. 使用java.net.URL和java.io.FileOutputStream(简化版,无HttpURLConnection)
    注意:这种方法实际上并不直接支持HTTP请求的高级功能(如设置请求头、处理重定向等),但在某些简单的场景下可能足够。对于复杂的HTTP请求,建议使用HttpURLConnection或更高级的库。
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.URL;  public class SimpleDownloader {  public static void downloadAndSave(String urlString, String filePath) {  try (URL url = new URL(urlString);  InputStream in = url.openStream(); // 注意:这里使用的是openStream(),它简化了HTTP GET请求  FileOutputStream fos = new FileOutputStream(filePath)) {  byte[] buffer = new byte[4096];  int bytesRead;  while ((bytesRead = in.read(buffer)) != -1) {  fos.write(buffer, 0, bytesRead);  }  } catch (IOException e) {  e.printStackTrace();  }  }  public static void main(String[] args) {  String url = "http://example.com/somefile.txt";  String filePath = "downloaded_file.txt";  downloadAndSave(url, filePath);  }  
}
  1. 使用Apache HttpClient库
    Apache HttpClient是一个功能强大的HTTP客户端库,它提供了比HttpURLConnection更丰富的API和更好的灵活性。要使用HttpClient,你需要先将其添加到你的项目依赖中。

以下是一个使用Apache HttpClient下载文件的示例:

import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.CloseableHttpClient;  
import org.apache.http.impl.client.HttpClients;  
import org.apache.http.util.EntityUtils;  import java.io.FileOutputStream;  
import java.io.IOException;  public class HttpClientDownloader {  public static void downloadAndSave(String urlString, String filePath) {  try (CloseableHttpClient httpClient = HttpClients.createDefault();  HttpGet httpGet = new HttpGet(urlString);  FileOutputStream fos = new FileOutputStream(filePath)) {  httpClient.execute(httpGet, httpResponse -> {  try (InputStream inputStream = httpResponse.getEntity().getContent()) {  byte[] buffer = new byte[4096];  int bytesRead;  while ((bytesRead = inputStream.read(buffer)) != -1) {  fos.write(buffer, 0, bytesRead);  }  }  return null; // 这里返回null,因为我们不需要HttpResponse的进一步处理  });  } catch (IOException e) {  e.printStackTrace();  }  }  // 注意:上面的代码示例使用了HttpClient的异步执行方式(通过execute方法的lambda表达式),  // 但这实际上并不是异步的,因为lambda表达式内部是同步执行的。  // 对于真正的异步下载,你可能需要使用HttpClient的异步API(如FutureCallback等)。  // 为了简化,这里提供一个更直接的同步下载示例:  public static void downloadAndSaveSync(String urlString, String filePath) throws IOException {  try (CloseableHttpClient httpClient = HttpClients.createDefault();  HttpGet httpGet = new HttpGet(urlString);  FileOutputStream fos = new FileOutputStream(filePath)) {  CloseableHttpResponse response = httpClient.execute(httpGet);  try {  InputStream inputStream = response.getEntity().getContent();  byte[] buffer = new byte[4096];  int bytesRead;  while ((bytesRead = inputStream.read(buffer)) != -1) {  fos.write(buffer, 0, bytesRead);  }  } finally {  response.close();  }  }  }  public static void main(String[] args) {  String url = "http://example.com/somefile.txt";  String filePath = "downloaded_file.txt";  // 使用同步方法  try {  downloadAndSaveSync(url, filePath);  } catch (IOException e) {  e.printStackTrace();  }  }  
}

请注意,上面的downloadAndSave方法实际上并没有以异步方式工作,因为lambda表达式内的代码是同步执行的。我提供了一个名为downloadAndSaveSync的同步方法作为替代,它更直接地展示了如何使用HttpClient进行文件下载。如果你需要真正的异步处理,你应该查看HttpClient的异步API文档。


http://www.ppmy.cn/ops/123763.html

相关文章

git fetch 和 git pull 的区别

git fetch 和 git pull 的区别 git fetch 功能:git fetch 用于从远程仓库获取最新的代码和提交信息,并将其保存到本地仓库的相应远程跟踪分支中,不会自动合并或修改当前的工作目录或当前分支。 合并:此命令不会自动合并获取的更新…

vue双向绑定/小程序双向绑定区别

Vue双向绑定与小程序双向绑定在实现方式、语法差异以及功能特性上均存在显著区别。以下是对这两者的详细比较: 一、实现方式 Vue双向绑定 Vue的双向绑定主要通过其响应式数据系统实现。Vue使用Object.defineProperty()方法(或在Vue 3中使用Proxy对象&am…

使用axios封装AJAX

一 、Http 请求报文 包括了三部分: 求情行、请求头,请求体。 1、请求行: 是HTTP请求的第一行,包含了请求方法、请求目标和HTTP协议版本。常用的请求方法有GET、POST、PUT、DELETE等,用于指定客户端希望服务器执行的操作。请求目标是指请求的资源路径,可以是一个具体的…

大贤3D家谱-一键寻找家谱本源

点击“溯”,您可以追溯到当前节点的家谱本源。 这一功能将帮助您更深入地了解家族的历史和背景。 通过这一操作,系统会自动标注出与您当前节点相关的祖先信息,并以金色字体突出显示,便于您快速识别和查看。 演示如下&#xff1…

matlab初学习记录

文章目录 内置函数与变量matlab 编辑器数组等间距向量数组函数数组索引提取多个元素 对向量执行数组计算查看文档 画图添加注释 实践导入数据关系运算符分支恒星运动 matlab 学习看入门之旅 先计算等号右边再计算等号左边。 工作区记录等号右边的变量。 ; 表示的是抑制输出。…

基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(1)- 拖拉拽交互

基于特定的应用场景,需要在页面中以网格的方式,实现目标组件在网格中可以进行拖拉拽、修改大小等交互。本章开始分享如何一步步从代码设计,最后到如何在 NPM 上发布。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug…

基于深度学习的不遗忘训练

基于深度学习的不遗忘训练(也称为抗遗忘训练或持久性学习)是针对模型在学习新任务时可能会忘记已学习内容的一种解决方案。该方法旨在使深度学习模型在不断接收新信息的同时,保持对旧知识的记忆。以下是这一领域的主要内容和方法:…

Ansible 工具从入门到使用

1. Ansible概述 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主…