吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2148|回复: 18
收起左侧

[其他原创] go语言编写的批量下载图片工具,附源码

[复制链接]
1942 发表于 2023-6-13 09:06
本帖最后由 1942 于 2023-6-13 09:12 编辑

给同事写的一个批量下账图片的小工具,go语音编写的 代码有点粗糙, 附上源码 和 编译好的 win版本 。
打包mac 或者 linux 版本可以把 win32api 的调用去掉。
按照说明格式整理好excel文件即可。
=====================================================================
https://wwxq.lanzoub.com/b02kn2ayh
密码:hst9
听说发远程帖子能赚币子

=================================================================================

企业微信截图_20230613090223.png



[Golang] 纯文本查看 复制代码
/*
 Description: 下载excel中的图片
 author: Phoenix
 date: 20230613
 email: [url=mailto:1044714221@qq.com]1044714221@qq.com[/url]
*/
package main

import (
        "errors"
        "fmt"
        "github.com/tealeg/xlsx"
        "io"
        "net/http"
        "os"
        "path/filepath"
        "strings"
        "sync"
        "syscall"
        "unsafe"
)

func main() {

        // 1. 获取当前文件位置
        dir, err := os.Getwd()
        if err != nil {
                Msg("Error", err.Error())
        }

        // 2. 获取当前文件夹下所有的excel文件
        fileList := make([]string, 0)
        filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { // 遍历当前文件夹下所有文件
                if filepath.Ext(path) == ".xlsx" {                                    // 判断文件后缀是否为.xlsx
                        fileList = append(fileList, path) // 将文件路径添加到fileList中
                }
                return nil
        })

        // 3. 读取excel文件
        for _, file := range fileList {
                // 获取文件名称
                fileName := filepath.Base(file)
                // 创建同名文件夹
                dirName := fileName[:len(fileName)-len(filepath.Ext(fileName))]
                os.Mkdir(dirName, os.ModePerm)
                dataList := ReadExcel(file)

                wg := sync.WaitGroup{}
                maxGoroutine := make(chan struct{}, 20) // 最大并发数

                for _, data := range dataList {
                        m := make(map[string]string)
                        for k, v := range data {
                                m[k] = v
                        }
                        wg.Add(1)
                        go func(m map[string]string) {
                                maxGoroutine <- struct{}{}
                                DownLoadImgs(m["list"], m["name"], dir+"/"+dirName)
                                <-maxGoroutine
                                wg.Done()
                        }(m)
                }
                wg.Wait()
        }
        Msg("Success", "下载完成")
}

// ------------------------------ util ------------------------------

func DownLoadImgs(imgs string, filename, imgPath string) {
        fmt.Println("imgPath:", imgPath)
        // imgs 转为 []string  按照逗号分隔
        urls := strings.Split(imgs, ",")
        for index, url := range urls {
                // 下载图片
                imgName := filepath.Base(url)
                imgTag := filepath.Ext(imgName) // 获取图片后缀
                imgPath2 := filepath.Join(imgPath, filename)
                os.Mkdir(imgPath2, os.ModePerm)
                imgName2 := filepath.Join(imgPath, filename, filename+"_"+fmt.Sprintf("%d", index+1)+imgTag)
                // 2. 下载图片
                DownloadFile(url, imgName2)
        }
}

// DownloadFile 下载图片
func DownloadFile(url, filename string) (err error) {
        resp, err := http.Get(url)
        if err != nil {
                Msg("Error1", err.Error())
                os.Exit(1)
                return errors.New("下载图片失败" + err.Error())
        }
        defer resp.Body.Close()
        file, err := os.Create(filename)
        if err != nil {
                Msg("Error2", err.Error())
                os.Exit(1)
                return errors.New("创建图片失败" + err.Error())
        }
        defer file.Close()
        _, err = io.Copy(file, resp.Body)
        if err != nil {
                Msg("Error3", err.Error())
                os.Exit(1)
                return errors.New("保存图片失败" + err.Error())
        }
        return nil
}

// Msg 弹窗
func Msg(msgType string, msg string) {
        user32 := syscall.MustLoadDLL("user32.dll")
        MessageBoxW := user32.MustFindProc("MessageBoxW")

        title := msgType
        text := msg
        ret, _, _ := MessageBoxW.Call(
                0,
                uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))),
                uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))),
                0)
        if ret == 0 {
                return
        }
}

// ReadExcel 读取xlsx文件
func ReadExcel(filename string) []map[string]string {
        var data []map[string]string
        xlFile, err := xlsx.OpenFile(filename)
        if err != nil {
                fmt.Println(err)
                return data
        }
        for _, sheet := range xlFile.Sheets {
                headers := make([]string, len(sheet.Rows[0].Cells))
                for i, cell := range sheet.Rows[0].Cells {
                        headers[i] = cell.String()
                }
                for _, row := range sheet.Rows[1:] {
                        rowData := make(map[string]string)
                        for i, cell := range row.Cells {
                                if headers[i] == "" {
                                        continue
                                }
                                rowData[headers[i]] = cell.Value
                        }
                        data = append(data, rowData)
                }
        }
        return data
}

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Caitingting + 1 + 1 稍加改造,我就可以那啥了嘻嘻嘻
MAOSKE + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xavier001 发表于 2023-6-13 09:21
写得不错,提个建议,下载之前判断一下文件是否存在,如果存在的话,就跳过不下载,这样可能体验会好一些,不用每次点开都重新下载全部
onlyclxy 发表于 2023-6-13 13:43
看见go过来试了试..为啥一直循环下载一个个图....
这个东西倒是用不上.就是一半的程序   不过源码感谢提供参考
ynboyinkm 发表于 2023-6-13 09:13
wintop 发表于 2023-6-13 09:30
ynboyinkm 发表于 2023-6-13 09:13
正在纠结要不要学习GO

边学边玩。我也是学了个皮毛,现在都忘记了,工作需求又搞起来了py
zhiaipojie0313 发表于 2023-6-13 09:38
支持支持
 楼主| 1942 发表于 2023-6-13 09:50
xavier001 发表于 2023-6-13 09:21
写得不错,提个建议,下载之前判断一下文件是否存在,如果存在的话,就跳过不下载,这样可能体验会好一些, ...

有时候同名文件存在, 但是文件内容变了, 还不如覆写
lockxxx 发表于 2023-6-13 09:57
支持原创
可坏 发表于 2023-6-13 10:03
没懂,下载图片存储到xls里面?
Caitingting 发表于 2023-6-13 10:43
看完说明书,一种邪恶的用法在我的心中萌芽了
qiqi2050352 发表于 2023-6-13 10:44
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表