Board logo

标题: [其他] 【已解决】win7电脑用curl批量下载阿里云服务器图片的问题 [打印本页]

作者: 52hz    时间: 2024-8-12 17:32     标题: 【已解决】win7电脑用curl批量下载阿里云服务器图片的问题

本帖最后由 52hz 于 2024-8-15 09:49 编辑

向大佬们问好。
在阿里云服务器有一批图片导出后是表格内含图片链接,我整理进list.txt文档后,用curl去批量下载。
bat代码如下:
  1. @echo off
  2. rem chcp 65001 >nul
  3. setlocal enabledelayedexpansion
  4. if not exist down\ md down\
  5. for /f "tokens=1-2 delims= " %%a in (%~dp0list.txt) do (
  6.     curl -s "%%b" > "down\%%a.jpg" -H "User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
  7. )
  8. 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简中系统测试通过...仅供参考
  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


    大佬,我刚才按照你说的改了那行格式,测试结果是图片可以打开,但是名称是乱码。不过我不太确定我改的代码对不对:
  1. @echo off
  2. rem chcp 65001 >nul
  3. setlocal enabledelayedexpansion
  4. if not exist down\ md down\
  5. for /f "tokens=1-2 delims= " %%a in (%~dp0list.txt) do (
  6.     curl -s -o down\%%a.jpg %%b -H "User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
  7. )
  8. 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://www.bathome.net/) Powered by Discuz! 7.2