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