<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Curl on ynhugo.github.io</title>
        <link>https://ynhugo.github.io/tags/curl/</link>
        <description>Recent content in Curl on ynhugo.github.io</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>ynhugo</copyright>
        <lastBuildDate>Thu, 21 May 2026 01:06:06 +0800</lastBuildDate><atom:link href="https://ynhugo.github.io/tags/curl/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>深入浅出curl -J智能下载文件名的正确姿势</title>
        <link>https://ynhugo.github.io/p/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAcurl-j%E6%99%BA%E8%83%BD%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</link>
        <pubDate>Thu, 21 May 2026 01:06:06 +0800</pubDate>
        
        <guid>https://ynhugo.github.io/p/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAcurl-j%E6%99%BA%E8%83%BD%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%A7%BF%E5%8A%BF/</guid>
        <description>
&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-1&#34;&gt;
引言
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
在日常使用 `curl` 下载文件时，你可能会遇到这样的问题：一个下载链接的 URL 末尾并不包含文件名（例如 API 导出、GitHub 的 codeload 链接），直接用 `curl -O` 保存下来的文件名往往是混乱的（比如 &lt;code class=&#34;verbatim&#34;&gt;download&lt;/code&gt; 或一个 ID）。&lt;/p&gt;
&lt;p&gt;
幸运的是，HTTP 协议提供了一个标准机制：服务器可以在响应头中通过 `Content-Disposition` 字段告诉客户端“建议的文件名”。`curl` 的 `-J`（`–remote-header-name`）选项正是为此而生。&lt;/p&gt;
&lt;p&gt;
本文将详细介绍 `curl -J` 的背景、用法、注意事项以及实际案例。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-2&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-2&#34;&gt;
为什么需要 `-J`
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-2&#34; class=&#34;outline-text-2&#34;&gt;
&lt;div id=&#34;outline-container-headline-3&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-3&#34;&gt;
传统的 `-O` 的局限
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-3&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;`curl -O &lt;a href=&#34;https://example.com/download.php?id=123&#34;&gt;https://example.com/download.php?id=123&lt;/a&gt;`  
保存的文件名会是 `download.php`，而不是真正的 `report.pdf`。&lt;/li&gt;
&lt;li&gt;即使 URL 以路径结尾，如 `/files/12345`，保存下来也是 `12345`。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-4&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-4&#34;&gt;
服务器给出的建议文件名
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-4&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
一个典型的 `Content-Disposition` 响应头：&lt;/p&gt;
&lt;div class=&#34;src src-http&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;Content-Disposition: attachment; filename=&amp;#34;KodExplorer-4.54.zip&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
其中 `filename=` 后面的值就是建议的文件名。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-5&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-5&#34;&gt;
`-J` 的作用
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-5&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
`-J` 告诉 `curl`：**忽略 URL 中的文件名，转而从 `Content-Disposition` 头中提取文件名来保存**。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-6&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-6&#34;&gt;
基本用法
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-6&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
`-J` 必须与 `-O`（`–remote-name`）一起使用，单独使用无效。&lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -JLO &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://codeload.github.com/kalcaddle/KodExplorer/zip/refs/tags/4.54&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;`-J` ：使用响应头中的文件名&lt;/li&gt;
&lt;li&gt;`-L` ：跟随重定向（GitHub codeload 会重定向，必须加上）&lt;/li&gt;
&lt;li&gt;`-O` ：保存文件（与 `-J` 结合后，文件名由服务器决定）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;执行后，当前目录下会出现 `KodExplorer-4.54.zip` 文件。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-7&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-7&#34;&gt;
命令选项详解
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-7&#34; class=&#34;outline-text-2&#34;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;选项&lt;/th&gt;
&lt;th&gt;长选项&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;`-J`&lt;/td&gt;
&lt;td&gt;`–remote-header-name`&lt;/td&gt;
&lt;td&gt;使用 `Content-Disposition` 中的文件名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`-O`&lt;/td&gt;
&lt;td&gt;`–remote-name`&lt;/td&gt;
&lt;td&gt;将文件保存为远程文件名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`-L`&lt;/td&gt;
&lt;td&gt;`–location`&lt;/td&gt;
&lt;td&gt;自动跟随 3xx 重定向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`-C`&lt;/td&gt;
&lt;td&gt;`–continue-at`&lt;/td&gt;
&lt;td&gt;断点续传&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div id=&#34;outline-container-headline-8&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-8&#34;&gt;
组合使用示例
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-8&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;基本下载&lt;/strong&gt;&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -JLO https://example.com/download?file&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;123&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;断点续传 + 智能文件名&lt;/strong&gt;&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -JLO -C - https://example.com/largefile&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;静默模式 + 显示进度&lt;/strong&gt;&lt;/strong&gt;  &lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -JLO --progress-bar https://example.com/archive.zip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-9&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-9&#34;&gt;
从响应头中手动提取文件名
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-9&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
如果你只是想获取文件名而不想下载文件（比如用于脚本），可以用以下命令：&lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -sI &lt;span class=&#34;s2&#34;&gt;&amp;#34;URL&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk -F&lt;span class=&#34;s1&#34;&gt;&amp;#39;filename=&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;/content-disposition/ {print $2}&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tr -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;\r&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
该命令会输出类似 `KodExplorer-4.54.zip` 的结果。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-10&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-10&#34;&gt;
注意事项与坑
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-10&#34; class=&#34;outline-text-2&#34;&gt;
&lt;div id=&#34;outline-container-headline-11&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-11&#34;&gt;
1. 文件名中的引号和空格
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-11&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
有些服务器返回 `filename=&amp;#34;file name.zip&amp;#34;` 带双引号。`curl -J` 会正确处理并去掉引号，但手动提取时可能需要额外处理。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-12&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-12&#34;&gt;
2. 编码问题
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-12&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
根据 RFC 6266，文件名可以是 `filename*=UTF-8&amp;#39;&amp;#39;…` 这种形式（支持非 ASCII）。老版本 `curl` 可能不完全支持，建议升级到 `7.83.0` 以上版本。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-13&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-13&#34;&gt;
3. 重定向时的文件名行为
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-13&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
从 curl 7.83.0 开始，`-J` 也会从*最终*响应（即重定向链的最后一步）中提取 `Content-Disposition`。旧版本可能只检查第一个响应。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-14&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-14&#34;&gt;
4. 安全风险
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-14&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
`curl` 不会对 `Content-Disposition` 中的文件名做路径遍历过滤。如果服务器返回 `filename=&amp;#34;../../etc/passwd&amp;#34;`，`curl -JLO` 可能会覆盖上层目录的文件。**建议仅在信任的网站使用**。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-15&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-15&#34;&gt;
5. `-J` 会覆盖 `-O` 的默认行为
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-15&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
一旦使用 `-J`，`-O` 从 URL 提取的文件名将被完全忽略。如果你希望 fallback（当没有 `Content-Disposition` 时使用 URL 文件名），可以自己编写脚本判断。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-16&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-16&#34;&gt;
实际案例
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-16&#34; class=&#34;outline-text-2&#34;&gt;
&lt;div id=&#34;outline-container-headline-17&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-17&#34;&gt;
案例1：下载 GitHub Release 资产
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-17&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
GitHub Release 中的附件 URL 通常类似：
`&lt;a href=&#34;https://github.com/user/repo/releases/download/v1.0/asset-name&#34;&gt;https://github.com/user/repo/releases/download/v1.0/asset-name&lt;/a&gt;`&lt;/p&gt;
&lt;p&gt;
直接 `curl -O` 会得到 `asset-name`，这是正确的。但如果 URL 是一个重定向到 CDN 的临时链接，`-J` 能保证最终文件名正确。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-18&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-18&#34;&gt;
案例2：从 API 导出报表
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-18&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
许多 Web 应用的数据导出接口会返回 `Content-Disposition`，例如：&lt;/p&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -JLO -u user:pass &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://myapp.com/api/export/csv?date=2026-05-21&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
保存的文件名可能是 `report_2026-05-21.csv`。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-19&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-19&#34;&gt;
案例3：下载 KodExplorer 源码包
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-19&#34; class=&#34;outline-text-3&#34;&gt;
&lt;div class=&#34;src src-bash&#34;&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -JLO &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://codeload.github.com/kalcaddle/KodExplorer/zip/refs/tags/4.54&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
自动保存为 `KodExplorer-4.54.zip`。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-20&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-20&#34;&gt;
常见问题
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-20&#34; class=&#34;outline-text-2&#34;&gt;
&lt;div id=&#34;outline-container-headline-21&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-21&#34;&gt;
Q1: 为什么我的 `curl -JLO` 保存的文件名还是 URL 最后一段？
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-21&#34; class=&#34;outline-text-3&#34;&gt;
&lt;ul&gt;
&lt;li&gt;可能原因1：服务器没有返回 `Content-Disposition` 头。可以用 `curl -I` 检查。&lt;/li&gt;
&lt;li&gt;可能原因2：`curl` 版本太老（低于 7.20.0）。升级即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-22&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-22&#34;&gt;
Q2: `-J` 和 `-O` 的顺序有要求吗？
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-22&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
没有。通常写作 `-JLO` 或 `-O -J -L` 均可。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-23&#34; class=&#34;outline-3&#34;&gt;
&lt;h3 id=&#34;headline-23&#34;&gt;
Q3: 如何强制覆盖已存在的文件？
&lt;/h3&gt;
&lt;div id=&#34;outline-text-headline-23&#34; class=&#34;outline-text-3&#34;&gt;
&lt;p&gt;
`-JLO` 默认不会覆盖，如果文件已存在会报错。使用 `-JLO -C -` 可以继续下载，不会覆盖。若要强制覆盖，可先 `rm -f` 或使用 `-o` 重命名。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-24&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-24&#34;&gt;
参考资料
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-24&#34; class=&#34;outline-text-2&#34;&gt;
&lt;ul&gt;
&lt;li&gt;[curl 官方手册：-J, –remote-header-name](&lt;a href=&#34;https://curl.se/docs/manpage.html#-J)&#34;&gt;https://curl.se/docs/manpage.html#-J)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[curl 官方文档：Content-Disposition](&lt;a href=&#34;https://curl.se/docs/features.html#Content-Disposition)&#34;&gt;https://curl.se/docs/features.html#Content-Disposition)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[Daniel Stenberg 博客：Improving curl -J (2026)](&lt;a href=&#34;https://daniel.haxx.se/blog/2026/01/27/improving-curl-j/)&#34;&gt;https://daniel.haxx.se/blog/2026/01/27/improving-curl-j/)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[RFC 6266: Use of the Content-Disposition Header Field](&lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc6266)&#34;&gt;https://datatracker.ietf.org/doc/html/rfc6266)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;outline-container-headline-25&#34; class=&#34;outline-2&#34;&gt;
&lt;h2 id=&#34;headline-25&#34;&gt;
总结
&lt;/h2&gt;
&lt;div id=&#34;outline-text-headline-25&#34; class=&#34;outline-text-2&#34;&gt;
&lt;p&gt;
`curl -JLO` 是一个优雅的解决方案，让你不必手动解析响应头或猜测文件名。它尊重 HTTP 规范，同时简化了脚本和日常下载操作。使用时请注意重定向、编码和安全问题，并根据 `curl` 版本调整行为。&lt;/p&gt;
&lt;p&gt;
希望这篇文章能帮助你更好地使用 `curl` 进行文件下载。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
        </item>
        
    </channel>
</rss>
