使用Protractor下载无扩展名图片并解决上传报错问题
解决Protractor中图片下载无扩展名导致上传失败的问题
嘿,这个问题我之前做自动化测试的时候也遇到过!你遇到的问题根源是:你下载的图片URL最后一段是无扩展名的哈希值,image-downloader默认就用这段哈希作为文件名,自然没有.jpg/.png这类后缀,导致上传时校验不通过。给你几个实用的解决办法:
方法1:手动指定带扩展名的保存路径
如果你提前知道图片的格式(比如是JPG),直接在dest里指定完整的文件名+扩展名就行,简单直接:
const download = require('image-downloader'); const options = { url: 'https://dbamedia.blob.core.windows.net/files/34f6fbc070754541a8828bb78c6a1e87', dest: './files/34f6fbc070754541a8828bb78c6a1e87.jpg' // 手动添加.jpg扩展名 } download.image(options) .then(({ filename, image }) => { console.log('File saved to', filename) }) .catch((err) => { console.error(err) });
方法2:通过响应头自动识别文件类型并添加扩展名
如果不确定图片格式,或者要处理多种格式的图片,可以从服务器返回的响应头里提取Content-Type,自动匹配对应的扩展名,灵活性更高:
const download = require('image-downloader'); const path = require('path'); const fs = require('fs').promises; async function downloadImageWithAutoExtension(url, destDir) { // 先下载文件,暂时用默认文件名 const downloadResult = await download.image({ url, dest: destDir }); const contentType = downloadResult.response.headers['content-type']; // 根据Content-Type匹配扩展名 let extension = ''; if (contentType.includes('jpeg') || contentType.includes('jpg')) { extension = '.jpg'; } else if (contentType.includes('png')) { extension = '.png'; } else if (contentType.includes('gif')) { extension = '.gif'; } else { // 兜底处理,比如用通用的.img扩展名 extension = '.img'; } // 重命名文件,添加扩展名 const oldFilePath = downloadResult.filename; const newFilePath = oldFilePath + extension; await fs.rename(oldFilePath, newFilePath); console.log('File saved to', newFilePath); return { filename: newFilePath, image: downloadResult.image }; } // 调用函数处理下载 downloadImageWithAutoExtension('https://dbamedia.blob.core.windows.net/files/34f6fbc070754541a8828bb78c6a1e87', './files') .catch(err => console.error(err));
方法3:直接指定自定义文件名
image-downloader支持通过filename参数直接设置带扩展名的文件名,这样下载后会直接用你指定的名称保存:
const download = require('image-downloader'); const options = { url: 'https://dbamedia.blob.core.windows.net/files/34f6fbc070754541a8828bb78c6a1e87', dest: './files', filename: 'test-image.jpg' // 指定带扩展名的文件名 } download.image(options) .then(({ filename, image }) => { console.log('File saved to', filename) }) .catch((err) => { console.error(err) });
你可以根据自己的场景选最合适的方法:如果是固定格式的图片,方法1最快;如果要处理多种未知格式,方法2最靠谱;如果需要统一命名,方法3最方便。
内容的提问来源于stack exchange,提问作者Devleena
相关产品推荐
相关产品推荐

