当前位置: 首页 > article >正文

java 批量下载doc\excle\pdf

指定图片集合

下载到指定文件夹

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);}
}




相关文章:

java 批量下载doc\excle\pdf

指定图片集合 下载到指定文件夹 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<Strin…...

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

在软件开发的新时代&#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;能在低成本硬件上…...

PyArrow 和 Parquet 的组合通过内存优化和高效存储,显著提升大数据处理的性能

PyArrow 和 Apache Parquet 是处理大规模数据的高效工具组合&#xff0c;它们结合了内存优化和列式存储的优势&#xff0c;适用于多种大数据场景。以下是对两者的详细解析及其协同工作的方式&#xff1a; ### 1. **PyArrow 的核心作用** - **Apache Arrow 实现**&#xff1…...

Oracle数据库服务器地址变更与监听配置修改完整指南

一、前言 在企业IT运维中&#xff0c;Oracle数据库服务器地址变更是常见的运维操作。本文将详细介绍如何安全、高效地完成Oracle数据库服务器地址变更及相关的监听配置修改工作&#xff0c;确保数据库服务在迁移后能够正常运行。 二、准备工作 1. 环境检查 确认新旧服务器I…...

2025.03.23【前沿工具】| CellPhoneDB:基因网络分析与可视化的利器

文章目录 1. CellPhoneDB工具简介2. CellPhoneDB的安装方法3. CellPhoneDB常用命令 1. CellPhoneDB工具简介 在单细胞生物学的迅猛发展中&#xff0c;理解细胞间的通讯机制对于揭示组织功能和疾病状态至关重要。CellPhoneDB工具&#xff0c;作为一个专门设计用来分析单细胞转录…...

Keepalived 实现高可用方案

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

如何使用DeepSeek编写测试用例?

一、DeepSeek在测试用例设计中的定位 DeepSeek作为AI工具,并非直接替代测试设计,而是通过以下方式提升效率: 快速生成基础用例框架(等价类、边界值等) 智能补充易遗漏场景(如特殊字符、异常流) 自动化脚本片段生成(Python/pytest/JUnit等) 测试数据构造建议(符合业务…...

python暴力破解html表单

import requests import time# 目标URL url "http://192.168.3.101/pikachu/vul/burteforce/bf_form.php" # 请替换为实际的目标URL# 已知的用户名 username "admin"# 密码字典文件路径 password_file "passwords.txt"# 伪造请求头&#xff…...

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

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

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

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

Day39 | 724. 寻找数组的中心下标、34. 在排序数组中查找元素的第一个和最后一个位置、922. 按奇偶排序数组 II、35. 搜索插入位置

724. 寻找数组的中心下标 题目链接&#xff1a;724. 寻找数组的中心下标 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;简单 代码&#xff1a; class Solution {public int pivotIndex(int[] nums) {int sum0;for(int i0;i<nums.length;i){sumnums[i];}…...

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

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

怎么查看linux是Ubuntu还是centos

要确定你的Linux系统是基于Ubuntu还是CentOS&#xff0c;可以通过几种不同的方法来进行判断。下面是一些常用的方法&#xff1a; 要快速判断 Linux 系统是 Ubuntu 还是 CentOS&#xff0c;可通过以下方法综合验证&#xff1a; 一、查看系统信息文件 1. /etc/os-release 文件…...

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

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

微服务中的服务发现与注册中心

在微服务架构中&#xff0c;服务实例的数量可能随着流量负载自动扩展或缩减&#xff0c;因此服务之间如何高效地进行通信成为一个重要问题。本篇博客将介绍服务发现的概念&#xff0c;并结合 Consul 和 自定义注册中心 进行实践&#xff0c;帮助开发者在微服务架构下高效管理服…...

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】利用域代码快速实…...

基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路

下面为你呈现一个基于动态 FOF&#xff08;基金中的基金&#xff09;策略的基金交易推荐系统的设计与实现思路&#xff0c;同时给出一个简单的 Python 示例代码。 系统设计 1. 需求分析 收集各类基金的历史数据&#xff0c;涵盖净值、收益率、风险指标等。依据动态 FOF 策略…...

【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.…...