curl传递@filename字符串而非文件内容问题咨询(v7.29.0)
问题
尝试使用curl将1M大小的XML文件作为CLOB存储到数据库表中,执行的curl命令为:
curl -X -d p_file=@myfile.xml https://hostname/pls/dad/package.myprocedure
对应的数据库存储过程如下:
procedure myprocedure(p_file IN clob) is begin insert into mytable (myclob) values (p_file); end;
实际存入CLOB的是字符串@myfile.xml而非文件内容;但直接传递字面量字符串(如curl -X -d p_file="This is my data" https://hostname/pls/dad/package.myprocedure)时,能正常存入对应内容。当前服务器curl版本为v7.29.0,疑问是:@符号读取文件内容的用法是否在该版本之后才支持?
解答
@语法的版本支持情况
curl中用@前缀指定文件读取数据的用法,早在远低于7.29.0的版本就已经支持(至少在7.10.x版本就已存在),所以版本不是导致问题的原因。问题根源:curl命令参数错误
你的命令中-X参数后面缺少了请求方法(比如POST),这会导致curl解析参数逻辑混乱。-X是用来指定HTTP请求方法的选项,必须跟方法名配合使用(如-X POST)。当只写-X不加方法时,curl会把后续的-d当作请求方法处理,进而导致p_file=@myfile.xml没有被正确解析为读取文件,而是被当作普通字符串传递。正确的curl命令写法
修正参数顺序,补充完整请求方法:
curl -X POST -d p_file=@myfile.xml https://hostname/pls/dad/package.myprocedure
或者,由于-d参数默认会使用POST方法,也可以省略-X POST,直接写:
curl -d p_file=@myfile.xml https://hostname/pls/dad/package.myprocedure
- 验证建议
如果想确认当前curl版本是否支持该语法,可以执行以下命令测试:
echo "test content" > test.txt curl -d @test.txt https://httpbin.org/post
查看返回的form数据,若显示文件内容而非@test.txt,则说明版本支持该用法。
内容的提问来源于stack exchange,提问作者James Schrumpf
相关产品推荐
相关产品推荐

