golang替换字符串中的图片链接,如何提升性能呢?

RafaelShin · 2022-12-07 09:14:14 · 3185 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-12-07 09:14:14 的主题,其中的信息可能已经有所发展或是发生改变。

给定字符串

content="<span class=""><img class="wscnph" src="https://static.images.net/202233142551646287375.jpg"><img class="wscnph" src="https://static.images.net/202233142551646287377.jpg"></span>"

使用正则匹配图片链接,然后上传图片到阿里云oss,获得图片的链接,然后替换字符串中图片的链接,如果给定的字符串中图片很多,怎样才能提高图片上传替换的速度

func Upload(url string) string {
    // 创建OSSClient实例。
    client, err := oss.New(Endpoint, key, AccessKeySecret)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    t1 := time.Now().Unix()
    if ti1 != t1 { //如果时间戳不一样,那么归零
        long = 0
    }
    ti1 = t1
    long++
    obj := fmt.Sprintf("article/%d%d.png", t1, long)
    // 获取存储空间。
    bucket, err := client.Bucket(BucketName)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 上传Byte数组。
    err = bucket.PutObject(obj, bytes.NewReader(ReadImgData(url)))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    return "https://" + BucketName + "." + Endpoint + "/" + obj
}
func RepImages(htmls string) string {
    var imgRE = regexp.MustCompile(`<img[^>]+\bsrc=["']([^"']+)["']`)
    imgs := imgRE.FindAllStringSubmatch(htmls, -1)
    out := make([]string, len(imgs))
    myImage := ""
    resHtml := htmls
    for i := range out {
        if ! strings.HasPrefix(imgs[i][1], "https://static.images.net") {
            myImage = Upload(imgs[i][1])
            resHtml = strings.Replace(resHtml, imgs[i][1], myImage, -1)
            out[i] = imgs[i][1]
            fmt.Println(strconv.Itoa(i), out[i])
        }
    }
    fmt.Println(resHtml)
    return resHtml
}

func main() {
    //a := BcryptHash("admin123$")
    //fmt.Print(a)
    content := "<span class=\"\"><img class=\"wscnph\" src=\"https://static.images.net/2022331359421646287182.jpg\"><img class=\"wscnph\" src=\"https://static.images.net/202233135942164628718777.jpg\"></span>"
    RepImages(content)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3185 次点击  
加入收藏 微博
4 回复  |  直到 2022-12-23 09:53:21
cevin
cevin · #1 · 2年之前

这不是经典的协程场景么

RafaelShin
RafaelShin · #2 · 2年之前
cevincevin #1 回复

这不是经典的协程场景么

该怎么优化呢,大佬?

cevin
cevin · #3 · 2年之前

2楼 @RafaelShin 伪代码 res := make(chan string)

wg := &sync.WaitGroup{}

for _, url := range imgs {

go func(url, wg) { defer wg.done 发起http请求, 发送给res

}

for xxx := range res { 拿到上传好的url 替换

wg.wait() close(res)

RafaelShin
RafaelShin · #4 · 2年之前
cevincevin #3 回复

2楼 @RafaelShin 伪代码 res := make(chan string) wg := &sync.WaitGroup{} for _, url := range imgs { go func(url, wg) { defer wg.done 发起http请求, 发送给res } for xxx := range res { 拿到上传好的url 替换 wg.wait() close(res)

非常感谢大佬指点

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传