go - 从 golang 中的响应流创建 Imagemagick 对象

标签 go amazon-s3 go-imagick

我正在使用以下代码从 Amazon S3 下载和上传图像。现在,下载图像后我想使用 imagick library 调整它的大小, 但没有将其写入磁盘。那么,我如何直接从我将从 S3 获得的响应流创建图像 magick 对象并将其上传到 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") 
}

最佳答案

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

如果直接获取对象,可以将其读入 []byte 中,然后传递给 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)
}
...

关于go - 从 golang 中的响应流创建 Imagemagick 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036200/

相关文章:

go - 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

go - 如何使用GOLang官方镜像导入冷门包到Docker?

Golang 将图像 magick 对象转换为 []byte

buffer - 如何在 Golang 的字节缓冲区中解压缩各种形式的整数?

go - Effective Go if 语句详解

amazon-web-services - Terraform ELB S3 权限问题

javascript - 通过 AWS 开发工具包创建签名的 S3 和 Cloudfront URL

compilation - Go - 无法编译 hello world (Windows)

amazon-web-services - 如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理引号 (CSV) 中的字段