为了账号安全,请及时绑定邮箱和手机立即绑定

在 go lang 中从响应流创建 Image magick 对象

在 go lang 中从响应流创建 Image magick 对象

Go
繁星淼淼 2021-12-07 16:12:02
我正在使用以下代码从Amazon S3. 现在,下载图像后,我想使用imagick 库调整其大小,但不将其写入磁盘。那么,我如何直接从响应流创建图像魔法对象,我将从 S3 获取该对象并将其上传到 Amazon S3 上。您能否在下面的代码中建议相同的更改?另外,如何将其更改为从查询字符串中获取键值的 http 处理程序?我已经注释掉了我的图像魔法对象代码,因为我确定如何编写它。func main() {    file, err := os.Create("download_file")        if err != nil {            log.Fatal("Failed to create file", err)        }        defer file.Close()        downloader := s3manager.NewDownloader(session.New(&aws.Config{Region: aws.String(REGION_NAME)}))        numBytes, err := downloader.Download(file,            &s3.GetObjectInput{            Bucket: aws.String(BUCKET_NAME),            Key:    aws.String(KEY),            })        if err != nil {            fmt.Println("Failed to download file", err)            return        }        fmt.Println("Downloaded file", file.Name(), numBytes, "bytes")                        //mw := imagick.NewMagickWand()     //   defer mw.Destroy()     //  err = mw.ReadImage(file)     //  if err != nil {     //      panic(err)     //   }          // using io.Pipe read/writer file contents.        reader, writer := io.Pipe()        go func() {        io.Copy(writer, file)        file.Close()        writer.Close()        }()        uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String(REGION_NAME)}))        result, err := uploader.Upload(&s3manager.UploadInput{        Body:   reader,        Bucket: aws.String(BUCKET),        Key:    aws.String(KEY),        })        if err != nil {        log.Fatalln("Failed to upload", err)        }        log.Println("Successfully uploaded to", result.Location)            fmt.Println("code ran successfully") }
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

如果您想更有效地下载大文件,您只需要一个 DownloadManager。DownloadManager 需要一个WriterAt(通常是os.File),您必须通过 a[]byte或使用内存中的文件来实现自己。


如果直接获取对象,则可以将其读入[]byte可以传递给的 a ReadImageBlob:


out, err := s3Client.GetObject(&s3.GetObjectInput{

    Bucket: aws.String(BUCKET),

    Key:    aws.String(KEY),

})

if err != nil {

    log.Fatal(err)

}


img, err := ioutil.ReadAll(out.Body)

if err != nil {

    log.Fatal(err)

}


mw := imagick.NewMagickWand()

defer mw.Destroy()


err = mw.ReadImageBlob(img)

if err != nil {

    log.Fatal(err)

}

...


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信