java 批量下载doc\excle\pdf

news2025/3/30 3:14:47

指定图片集合

下载到指定文件夹

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

public class OfficeFileDownloader {

	/**
	 * 需要下载的Office文档URL列表
	 */
	private static final List<String> URL_LIST = Arrays.asList(
		"https://test.oss-cn-zhangjiakou.aliyuncs.com/template/20250113/1877528575184224257_2.pdf",
		"https://test.oss-cn-zhangjiakou.aliyuncs.com/template/20250316/1901150106568462338_2.pdf"
	);

	public static void main(String[] args) {
		// 文件保存目录
		String saveDir = "E:\\downloads/";

		// 创建保存目录
		File dir = new File(saveDir);
		if (!dir.exists() && !dir.mkdirs()) {
			System.err.println("目录创建失败: " + saveDir);
			return;
		}

		// 批量下载文件
		URL_LIST.forEach(url -> {
			try {
				String fileName = extractFileName(url);
				if (isValidFileType(fileName)) {
					String savePath = saveDir + fileName;
					downloadFile(url, savePath);
					System.out.println("√ 下载成功: " + fileName);
				} else {
					System.err.println("× 不支持的文件类型: " + fileName);
				}
			} catch (Exception e) {
				System.err.println("× 下载失败 [" + url + "]: " + e.getMessage());
			}
		});
	}

	/**
	 * 文件下载核心方法
	 *
	 * @param fileUrl
	 * @param savePath
	 * @throws IOException
	 */
	private static void downloadFile(String fileUrl, String savePath) throws IOException {
		URL url = new URL(fileUrl);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();

		try {
			// 配置网络参数
			connection.setRequestMethod("GET");
			connection.setRequestProperty("User-Agent", "Mozilla/5.0");
			connection.setConnectTimeout(10000); // 10秒连接超时
			connection.setReadTimeout(30000);   // 30秒读取超时

			// 验证HTTP响应
			int statusCode = connection.getResponseCode();
			if (statusCode != HttpURLConnection.HTTP_OK) {
				throw new IOException("HTTP " + statusCode + " - " + connection.getResponseMessage());
			}

			// 类型校验(仅记录警告)
			String contentType = connection.getContentType();
			validateContentType(contentType, savePath);

			// 流式下载文件
			try (InputStream in = connection.getInputStream();
				 FileOutputStream out = new FileOutputStream(savePath)) {
				byte[] buffer = new byte[8192];
				int bytesRead;
				while ((bytesRead = in.read(buffer)) != -1) {
					out.write(buffer, 0, bytesRead);
				}
			}
		} finally {
			connection.disconnect();
		}
	}

	/**
	 * 内容类型校验方法
	 *
	 * @param contentType
	 * @param savePath
	 */
	private static void validateContentType(String contentType, String savePath) {
		if (contentType == null) return;

		String ext = getFileExtension(savePath).toLowerCase();
		String mimeType = contentType.split(";")[0].trim().toLowerCase();

		boolean isValid = switch (ext) {
			case "doc" -> mimeType.equals("application/msword");
			case "docx" -> mimeType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
			case "xls" -> mimeType.equals("application/vnd.ms-excel");
			case "xlsx" -> mimeType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
			case "pdf" -> mimeType.equals("application/pdf");
			default -> true;
		};

		if (!isValid) {
			System.out.println("⚠ 类型警告: " + savePath +
				"\n   预期类型: " + getExpectedMimeType(ext) +
				"\n   实际类型: " + contentType);
		}
	}

	/**
	 * 获取预期MIME类型
	 *
	 * @param ext
	 * @return
	 */
	private static String getExpectedMimeType(String ext) {
		return switch (ext.toLowerCase()) {
			case "doc" -> "application/msword";
			case "docx" -> "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
			case "xls" -> "application/vnd.ms-excel";
			case "xlsx" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
			case "pdf" -> "application/pdf";
			default -> "unknown";
		};
	}

	/**
	 * 校验文件扩展名
	 */
	private static boolean isValidFileType(String fileName) {
		String ext = getFileExtension(fileName).toLowerCase();
		return ext.matches("docx?|xlsx?|pdf");
	}

	/**
	 * 从URL提取文件名
	 */
	private static String extractFileName(String fileUrl) {
		// 清理URL参数和锚点
		String cleanUrl = fileUrl.split("[?#]")[0];

		// 获取文件名部分
		int lastSlash = cleanUrl.lastIndexOf('/');
		if (lastSlash == -1 || lastSlash == cleanUrl.length() - 1) {
			throw new IllegalArgumentException("无效的URL格式: " + fileUrl);
		}

		return cleanUrl.substring(lastSlash + 1);
	}

	/**
	 * 获取文件扩展名
	 */
	private static String getFileExtension(String fileName) {
		int dotIndex = fileName.lastIndexOf('.');
		return (dotIndex == -1 || dotIndex == fileName.length() - 1) ?
			"" : fileName.substring(dotIndex + 1);
	}
}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件性能效率测试工具有哪些?专业第三方软件检测机构推荐

在软件开发的新时代&#xff0c;软件性能效率测试已经成为每个企业不可或缺的一部分。无论是在竞争激烈的市场中&#xff0c;还是在追求卓越用户体验的过程中&#xff0c;都需要进行有效的性能测试。 一、软件性能效率测试的目标   1、响应时间&#xff1a;确保用户请求的响…

使用flask_restful快速构建接口

Flask-RESTful 是一个用于快速构建 RESTful API 的 Flask 扩展。它简化了创建、管理和文档化 REST API 的过程。利用 Flask-RESTful&#xff0c;你可以更容易地将你的 Flask 应用程序组织成 RESTful 原则的风格 安装包 pip install flask_restful 快速构建接口 from flask im…

centos 7 部署FTP 服务用shell 搭建脚本,使用时稍微修改自己所需需求

#!/bin/bash # 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; then echo "此脚本需要以 root 用户身份运行。" exit 1 fi # 安装 vsftpd yum install vsftpd -y # 备份原始配置文件 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd…

Hadoop集群搭建(hdfs、yarn)

Hadoop 是 Apache 软件基金会旗下的一个开源项目&#xff0c;是用于处理大数据的分布式系统基础架构&#xff0c;被广泛应用于大数据存储、处理和分析等场景。 一、核心组件 1、Hadoop 分布式文件系统&#xff08;HDFS&#xff09; 具有高容错性&#xff0c;能在低成本硬件上…

Keepalived 实现高可用方案

Keepalived简介 ‌Keepalived‌ 是一个基于 ‌VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;协议‌的高可用性解决方案&#xff0c;主要用于实现‌服务故障自动切换&#xff08;Failover&#xff09;和负载均衡‌。通过管理虚拟 IP&#xff08;VIP&#xf…

医学图像分割数据集肺分割数据labelme格式6299张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图像分辨率&#xff1a;1024x1024 图片数量(jpg文件个数)&#xff1a;6299 标注数量(json文件个数)&#xff1a;6299 标注类别数&#xff1a;2 标注类别名称:["leftl…

C语言复习笔记--函数递归

在学习了函数之后,函数递归是我们必然会接触到的课题,下面就让我们看下函数递归相关的知识. 递归是什么&#xff1f; 递归这个词看着就不那么好理解,那么什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数自己调用自己. 写⼀个史上最简单的C语⾔递归代码: …

husky的简介以及如果想要放飞自我的解决方案

husky 是一个 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作时执行自定义脚本&#xff0c;比如代码检查&#xff08;Lint&#xff09;、单元测试&#xff08;Test&#xff09;、格式化代码…

侯捷 C++ 课程学习笔记:现代 C++ 中的移动语义与完美转发深度解析

1. 前言&#xff1a;为什么我们需要移动语义&#xff1f; 在侯捷老师的《C11/14/17 新特性详解》课程中&#xff0c;移动语义&#xff08;Move Semantics&#xff09;被称作"C近十年来最重要的革新"。传统C中饱受诟病的深拷贝性能问题&#xff0c;在现代C中通过移动语…

23种设计模式-结构型模式-适配器

文章目录 简介场景问题解决方案建立中间转换层关键收益 总结 简介 使接口不兼容的类实现协同工作&#xff0c;通过引入中间层实现客户端接口和服务端接口的兼容。典型场景比如整合第三方类库或遗留系统时保持代码兼容。 场景 假设你正在开发一个股票监控程序。这个程序会下…

美亚科技业绩波动明显:现金流为负,四起未决诉讼涉金额1700万

《港湾商业观察》施子夫 近期&#xff0c;广东美亚旅游科技集团股份有限公司&#xff08;以下简称&#xff0c;美亚科技&#xff09;披露第二轮审核问询函的回复。从两轮问询函监管层提出的问题来看&#xff0c;有关美亚科技业绩增长的合理性、募投项目的必要性及合理性、经营…

PyTorch 深度学习实战(21):元强化学习与 MAML 算法

一、元强化学习原理 1. 元学习核心思想 元强化学习&#xff08;Meta-RL&#xff09;旨在让智能体快速适应新任务&#xff0c;其核心是通过任务分布学习共享知识。与传统强化学习的区别在于&#xff1a; 对比维度传统强化学习元强化学习目标解决单一任务快速适应任务分布中的…

23中设计模式-迭代器(Iterator)设计模式

迭代器设计模式 &#x1f6a9;什么是迭代器设计模式&#xff1f;&#x1f6a9;迭代器设计模式的特点&#x1f6a9;迭代器设计模式的结构&#x1f6a9;迭代器设计模式的优缺点&#x1f6a9;迭代器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是…

Word中公式自动标号带章节编号

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;设置宽度分别为0.5&#xff0c;13.39和1.5&#xff0c;设置纵向居中&#xff0c;中间列居中对齐&#xff0c;最右侧列靠右对齐&#xff0c;设置段落如下 &#xff08;2&#xff09;插入域代码 【Word】利用域代码快速实…

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…

[7-01-03].SpringBoot3集成MinIo

MinIO学习大纲 一、Spingboot整合MinIo 第1步&#xff1a;搭建SpringBoot项目&#xff1a; 第2步&#xff1a;引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…

ISIS-3 LSDB链路状态数据库同步

上一章我们介绍了ISIS的邻居建立关系以及ISIS的路由器角色有哪些,在不同的网络类型当中建立邻居关系有什么不同,并且以实验案例抓包的形式给大家进一步介绍了建立的过程。 这一章我们来介绍ISIS中是如何实现链路状态数据库同步的,与OSPF的链路状态同步有什么不同,在不同网络类…

快速入手-基于Django的Form和ModelForm操作(七)

1、Form组件 2、ModelForm操作 3、给前端表单里在django里添加class相关属性值 4、前端 5、后端form 新增数据处理 6、更新数据处理

Springboot集成Debezium监听postgresql变更

1.创建springboot项目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…

Ubuntu22.04搭建freeradius操作说明

Ubuntu22.04搭建freeradius操作说明 更新依赖库 sudo apt update sudo apt install build-essential sudo apt install libtalloc-dev sudo apt install libssl-dev 按照freeradius sudo apt install freeradius 修改freeradius配置 文件路径如下 /etc/freeradius/3.…