拓冰建站拓冰建站
首页 / 资讯中心 / 正文

libcurl 文本传输模式:CURLOPT_TRANSFERTEXT 选项完全指南

libcurl 文本传输模式CURLOPT_TRANSFERTEXT 选项完全指南【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl导读CURLOPT_TRANSFERTEXT是 libcurl 中控制 FTP及其他协议传输模式的核心选项置 1 后FTP 下载/上传将使用 ASCII 模式而非默认的二进制模式适用于在不同换行符体系如 Unix 的 LF 与 Windows 的 CRLF之间传输纯文本文件。阅读本文后你将掌握该选项的 API 用法、默认行为、底层 FTPTYPE A命令实现原理、与命令行-B, --use-ascii的对应关系以及 libcurl 在 ASCII 转换上的已知局限。选项概述让 FTP 以文本模式传输CURLOPT_TRANSFERTEXT的作用非常单一而明确请求基于文本的 FTP 传输。参数设为 1 时libcurl 对 FTP 传输使用 ASCII 模式取代默认的二进制BINARY传输。该选项最典型的应用场景是在对换行符等字符有不同约定的系统之间传输文本数据。例如 Unix/Linux 使用\nLF而 Windows/DOS 使用\r\nCRLFmacOS 经典系统曾使用\rCR。当你在 Windows 与 Unix 主机之间通过 FTP 搬运.txt、.html、源代码等文本文件时ASCII 模式由服务器在传输过程中按需进行行尾转换从而避免收到每行结尾混入\r或换行丢失的乱码文件。函数签名选项通过curl_easy_setopt设置接口定义如下CURLOPT_TRANSFERTEXT 原文档 SYNOPSIS 节#include curl/curl.h CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFERTEXT, long text);参数text为long类型传1L启用 ASCII 文本传输传0L恢复默认的二进制传输。基础用法示例原文档提供了最小可运行示例完整保留如下对应 CURLOPT_TRANSFERTEXT 的 EXAMPLE 节int main(void) { CURL *curl curl_easy_init(); if(curl) { CURLcode result; curl_easy_setopt(curl, CURLOPT_URL, ftp://example.com/textfile); curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1L); result curl_easy_perform(curl); curl_easy_cleanup(curl); } }该示例以 ASCII 模式从ftp://example.com/textfile下载文本文件设置 URL 后置位CURLOPT_TRANSFERTEXT执行传输最后释放句柄。默认值与生效范围默认值0即禁用。libcurl 默认以二进制模式传输不会启用 ASCII 模式见原文档 DEFAULT 节。协议全部All。选项在任意协议上下文中均可设置但其语义主要在 FTP 中体现——内部实现会将其转换为 FTP 的TYPE A命令详见下文源码剖析。历史与命名演变从源码注释可以确认该选项的演变轨迹lib/setopt.c 中写道This option was previously named FTPASCII. Renamed to work with more protocols than merely FTP. Transfer using ASCII (instead of BINARY).即该选项最初名为FTPASCII后更名为CURLOPT_TRANSFERTEXT以便覆盖不止 FTP 的协议。在选项注册表中它被登记为长整型选项参见 lib/easyoptions.c。源码剖析从 setopt 到 FTP TYPE A 命令选项存储prefer_ascii 标志设置CURLOPT_TRANSFERTEXT后libcurl 将其值存入连接数据的prefer_ascii布尔标志lib/setopt.ccase CURLOPT_TRANSFERTEXT: s-prefer_ascii enabled; break;后续所有协议实现都读取该标志来决定是否启用文本传输。FTP 层发送 TYPE A 命令在 FTP 协议实现 lib/ftp.c 中ftp_nb_type()负责实际向服务器发送类型命令。libcurl 只处理 ASCII 或 BINARY 两种类型将标志转换为 FTP 命令字符后发送char want (char)(ascii ? A : I); ... result Curl_pp_sendf(data, ftpc-pp, TYPE %c, want);prefer_ascii为真时发送TYPE AASCII否则发送TYPE IIMAGE / Binary。函数还会将当前类型记录在ftpc-transfertype中若与目标类型一致则跳过重复发送避免多余的往返round-trip。在状态机中ftp_state_type()根据data-state.prefer_ascii决定对NOBODY仅取文件信息请求是否先设置类型再取大小lib/ftp.c注释明确说明Some servers return different sizes for different modes, and thus we must set the proper type before we check the size——不同模式下服务器返回的文件大小可能不同因此必须先设类型再查大小。ASCII 模式下的文件大小处理ASCII 传输会让实际传输字节数与服务器报告的 SIZE 不一致行尾转换会增减字节。因此 libcurl 在 ASCII 模式下刻意不依赖 SIZE 结果在 lib/ftp.c 中prefer_ascii为真时跳过对 RETR 响应中 N bytes 文本的解析并明确data-req.size -1;注释解释for servers that understate ASCII mode file size——有些服务器在 ASCII 模式下报出的文件大小偏小故不使用该数值以免干扰进度判断。在 lib/ftp.c 的上传完整性检查中启用转换crlf或prefer_ascii时比较逻辑区分无转换与可能有 CRLF 转换两种情况避免因转换造成的字节数差异被误判为CURLE_PARTIAL_FILE错误。与 CRLF 转换的关系CURLOPT_TRANSFERTEXT与另一个选项CURLOPT_CRLF见 CURLOPT_CRLF 文档相关但语义不同CURLOPT_CRLF让 libcurl 在上传时将 LF 转换为 CRLF存储于 lib/urldata.h 的crlf标志CURLOPT_TRANSFERTEXT仅请求服务器以 ASCII 模式传输是否真正做行尾转换取决于 FTP 服务器。在读取路径上两者有交汇当编译配置了CURL_PREFER_LF_LINEENDS时prefer_ascii也会触发上传数据流的 CRLF 转换器cr_lc_add()lib/sendf.c与crlf标志一并作为是否注入行尾转换 reader 的条件。命令行对应-B, --use-asciicurl 命令行工具将该选项暴露为-B, --use-ascii其定义在 docs/cmdline-opts/use-ascii.md帮助文本为 Use ASCII/text transfer见 src/tool_listhelp.c。curl -B ftp://example.com/README命令行文档还给出了两种等价强制方式FTP 场景使用以;typeA结尾的 URL 强制 ASCII 模式例如ftp://example.com/file;typeATFTP 场景使用以;modenetascii结尾的 URL例如tftp://example.com/file;modenetascii。参数解析位于 src/tool_getparam.c将use_ascii标志存入配置结构src/tool_cfgable.h随后在 src/config2setopts.c 中调用my_setopt_long(curl, CURLOPT_TRANSFERTEXT, config-use_ascii)映射为 libcurl 选项——与 API 层完全对应。Win32 注意命令行模式下--use-ascii会使输出到 stdout 的数据处于文本模式见 docs/cmdline-opts/use-ascii.md而 API 层的CURLOPT_TRANSFERTEXT原文档明确说明对 Win32 系统它不会将 stdout 设置为二进制模式——两者行为存在差异API 用户若在 Windows 上向 stdout 写二进制数据需自行处理。已知限制并非完整的 ASCII 转换原文档特意强调了一个长期存在且无人修复的局限务必在使用前了解libcurl does not do a complete ASCII conversion when doing ASCII transfers over FTP. This is a known limitation/flaw that nobody has rectified. libcurl only sets the mode to ASCII and performs a standard transfer.即libcurl 并不会执行完整的 ASCII 转换。它所做的仅仅是向 FTP 服务器发送TYPE A如上文ftp_nb_type()所示然后执行一次标准传输。真正的行尾转换依赖 FTP 服务器端在 ASCII 模式下自行完成。这意味着若服务器对TYPE A支持不完整或返回的仍为原样字节客户端拿到的可能是未转换的数据客户端侧不会对下载内容做额外的换行重写除上文提及的CURL_PREFER_LF_LINEENDS上传路径外因此该选项更适合向服务器请求文本模式的语义而非本地保证拿到规范化文本的承诺。返回值curl_easy_setopt返回CURLcode以指示成功或失败CURLE_OK0一切正常非零值发生错误具体错误码参见 libcurl-errors 文档对应原文档 RETURN VALUE 节。关联选项与延伸阅读CURLOPT_CRLF控制上传时 LF 到 CRLF 的转换见 CURLOPT_CRLFCURLOPT_URL传输目标地址本选项需与之配合使用命令行-B, --use-ascii本选项的命令行映射见 use-ascii 文档FTP 协议实现细节TYPE命令的发送与状态处理集中在 lib/ftp.c涉及ftp_nb_type()L3864-L3889与ftp_state_type()L1617-L1644等函数。小结CURLOPT_TRANSFERTEXT是 libcurl 中一个体量小但语义清晰的选项置 1 后 FTP 传输改用 ASCII 模式底层通过prefer_ascii标志驱动TYPE A命令的发送并在 SIZE 解析、上传完整性校验等环节做了配套处理。使用时要记住三点默认关闭只请求服务器端转换而非客户端完整转换与命令行--use-ascii及 URL 的;typeA/;modenetascii后缀可相互等价实现。对于跨平台文本文件交换它是避免换行符错乱的第一道正确设置。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门