Hi,

If I set Body to the out file itself, an item with the name of the outfile 
is uploaded to the S3 bucket, but that item is 0 bytes in size and when I 
click on it in S3 it doesn't appear, whereas with the buffer stuff, the 
image size in bytes is correct, but a black square shows up. This is how I 
get the out file in the first place:

file, header, err := r.FormFile("upload")

if err != nil {
fmt.Fprintln(w, err)
return
}

defer file.Close()

out, err := os.Create("/path/to/file/" + header.Filename)
if err != nil {
fmt.Fprintf(w, "Unable to create the file for writing. Check your write 
access privilege")
return
}

defer out.Close()

_, err = io.Copy(out, file)
if err != nil {
fmt.Fprintln(w, err)
}

I'm not sure why setting Body to the out file itself results in a 0 byte 
upload. Is there another way to upload the image to s3?

Thanks

On Tuesday, August 14, 2018 at 6:42:50 AM UTC-7, helloPiers wrote:
>
> It's not clear what the type of "out" is, other than it has Stat() and 
> Read([]byte) methods, but, assuming it's an io.Reader at least, if you 
> examine the return values from Read, like:
>   n, err := out.Read(buffer)
> you may get a clue to what's going wrong, for example n might not be the 
> full size of the file, there might be an error, etc. Likewise it's worth 
> checking the error returned from Stat. 
>
>
> It might be that "out" already is a ReadSeekCloser (if it's an *io.File 
> for example) in which case you can set Body in the UploadInput just to 
> "out":
>
>  ...
>  Body: out,
>  ...
>
> and dispense with all the stuff related to buffer.
>
>
> On Tuesday, August 14, 2018 at 6:18:43 AM UTC+1, Sachin Makaram wrote:
>>
>> Hi,
>>
>> I am trying to upload a local image file to an AWS S3 bucket and return 
>> the public URL in Golang. This is the core Golang code I have written to 
>> interact with my S3 bucket:
>>
>>     creds := 
>> credentials.NewSharedCredentials("/Users/username/.aws/credentials", 
>> "default")
>>
>>     config := &aws.Config{
>>         Region:      aws.String("us-west-2"),
>>         Credentials: creds,
>>     }
>>
>>     sess := session.New(config)
>>
>>     uploader := s3manager.NewUploader(sess, func(u *s3manager.Uploader) {
>>     u.PartSize = 64 * 1024 * 1024 
>>     u.LeavePartsOnError = true
>>     })
>>
>>     fmt.Println(header.Filename)
>>
>>     fileInfo, _ := out.Stat()
>> var size int64 =  fileInfo.Size()
>> fmt.Println("size", size)
>> buffer := make([]byte, size) 
>>
>> out.Read(buffer)
>> fileBytes := bytes.NewReader(buffer)
>>
>>     result, err := uploader.Upload(&s3manager.UploadInput{
>>         Bucket: aws.String("bucket-name"),
>>         Key: aws.String(header.Filename),
>>         Body: aws.ReadSeekCloser(fileBytes),
>>         ContentType: aws.String("image/jpeg"),
>>         ACL: aws.String("public-read"),
>>     })
>>     if err != nil || result == nil {
>>         log.Fatalln("Failed to upload", err)
>>     }
>>
>>     log.Println("Successfully uploaded to", result.Location)
>>
>> With this code, the file is uploaded successfully to my s3 bucket with 
>> the correct size in bytes, but when I click on the URL, a black square is 
>> displayed instead of the actual image. If I change the ContentType field to 
>> allow file types dynamically, when I click on the URL, it downloads the 
>> image, but the image cannot be opened because "it may have been damaged." 
>> How can I fix this Golang code to just upload an image to an S3 bucket and 
>> get the public URL as a result of that upload?
>>
>> This may be more of a debugging question pertaining to AWS S3 than 
>> Golang, but any help would be appreciated. Thank you!
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to