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

Create Image magick object from response stream in go lang

我正在使用以下代码从 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)
}
...