标题: [其他] 【已解决】win7电脑用curl批量下载阿里云服务器图片的问题 [打印本页]
作者: 52hz 时间: 2024-8-12 17:32 标题: 【已解决】win7电脑用curl批量下载阿里云服务器图片的问题
本帖最后由 52hz 于 2024-8-15 09:49 编辑
向大佬们问好。
在阿里云服务器有一批图片导出后是表格内含图片链接,我整理进list.txt文档后,用curl去批量下载。
bat代码如下:- @echo off
- rem chcp 65001 >nul
- setlocal enabledelayedexpansion
- if not exist down\ md down\
- for /f "tokens=1-2 delims= " %%a in (%~dp0list.txt) do (
- curl -s "%%b" > "down\%%a.jpg" -H "User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
- )
- pause
复制代码
list.txt文档(ANSI)格式如下:
CTA4331460010商品图_1 https://rama-prod.oss-cn-guangzh ... -file/CTA4331460010商品图_HWtN1723184103155.jpg
直接运行下载后,图片是损坏,但图片名称正确。把损坏图片用txt打开后是阿里云服务器的报错信息,翻译后就是:字符编码必须为utf-8
然后我把 list.txt文档 改成了UTF-8格式,下载后图片可以正常打开了,但是图片名称内的中文是乱码。其实这一步在代码后用for+ren对图片重新命名也是可以解决问题,但是我想找出到底哪里原因。所以就继续尝试……
为此我在代码中加入了一行 chcp 65001 >nul,然后下载图片名称对了,图又变回损坏的了。
我把链接复制到浏览器可以正常打开图片,再从浏览器地址栏复制下来的时候,链接中的中文被重新编译了,用重新编译后的链接保存UTF-8,代码中加上chcp 65001 >nul ,至此可以正常运行,图片本身和图片名称都没问题了。或者用重新编译后的链接保存ANSI,代码中不要chcp 65001 >nul 也是可以的。
期间也怀疑是curl版本不行,升级到最新版以后也没变。群里也有大佬说他win11电脑直接用第一次的方案就没问题。
请教大佬们遇到这种链接该怎么办?有没有更好的解决办法。
作者: aloha20200628 时间: 2024-8-12 18:04
本帖最后由 aloha20200628 于 2024-8-12 18:08 编辑
回复 1# 52hz
本论坛第三方下载 wget.exe 再用以下代码可一步完成 》文件名正确,图片完整。win8.1简中系统测试通过...仅供参考
- wget "https://rama-prod.oss-cn-guangzhou.aliyuncs.com/user-file/CTA4331460010商品图_HWtN1723184103155.jpg"
复制代码
作者: 52hz 时间: 2024-8-13 09:54
回复 2# aloha20200628
多谢大佬,我刚才下载安装了,测试确实好用,list.txt直接ANSI格式,链接没有用浏览器重新编译,代码也不用chcp 65001,图片和名称都没有问题。
作者: buyiyang 时间: 2024-8-13 12:53
是因为构造的请求头出现非utf-8编码的字符。用win10自带的curl没有问题。win7没有自带curl,可能是你下载的curl对utf-8编码的支持不行,除了看版本还要看编译器、编译链接选项。
作者: 52hz 时间: 2024-8-13 14:37
回复 4# buyiyang
哈?还有这么多讲究,我以为下载一个最新的就行了呢
作者: Five66 时间: 2024-8-14 09:53
弄了个C程序试了下,猜测大概curl是个使用了CRT传递的命令行参数的非unicode程序(gnu gcc编译的?)
不使用chcp 65001情况下,执行curl时的参数会不做转换原样传递,因此list.txt编码为utf8时会正确传到curl中,curl会获得utf8编码的参数
使用chcp 65001情况下,执行curl时的参数会转换成ansi(gbk)编码,因此就算list.txt是utf8编码,也会被转换成gbk然后传进curl中,curl会获得ansi(gbk)编码的参数
> "down\%%a.jpg" 是cmd的重定向,如果list.txt编码为utf8,不使用chcp 65001的话,cmd会将utf8按照ansi(gbk)方式解读,结果当然就是乱码
所以,楼主可以试试下面的
list.txt保存为UTF-8(最好不要带bom)
不使用chcp 65001(避免参数被转成ansi/gbk)
不使用cmd的重定向输出到文件,使用curl的-o选项输出到文件(避免cmd将utf8按照ansi/gbk解读造成乱码)
作者: 52hz 时间: 2024-8-14 10:37
回复 6# Five66
大佬,我刚才按照你说的改了那行格式,测试结果是图片可以打开,但是名称是乱码。不过我不太确定我改的代码对不对:- @echo off
- rem chcp 65001 >nul
- setlocal enabledelayedexpansion
- if not exist down\ md down\
- for /f "tokens=1-2 delims= " %%a in (%~dp0list.txt) do (
- curl -s -o down\%%a.jpg %%b -H "User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
- )
- pause
复制代码
作者: Five66 时间: 2024-8-15 00:33
回复 7# 52hz
啊,这无解了,除非不使用cmd
代码改对了,不过名称还是乱码很明显curl用的是C标准的文件IO函数(不是winapi),文件IO函数将传进去utf8当成ansi/gbk来解读了,造成输出文件的名称乱码了,或许只能修改curl的源码然后重新编译了
作者: 52hz 时间: 2024-8-15 09:48
回复 8# Five66
好,多谢大佬分析解答,那就不硬磕curl了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |