Skip to content

Instantly share code, notes, and snippets.

@AndreiD
Last active August 21, 2019 11:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndreiD/67e942783549e0c966b715782d0c27d0 to your computer and use it in GitHub Desktop.
Save AndreiD/67e942783549e0c966b715782d0c27d0 to your computer and use it in GitHub Desktop.
upload /download to firebase google and to AWS S3 golang
//---------- Firestore -------------
// ********* UPLOAD *******
configStorage := &firebase.Config{
StorageBucket: "xxxxxxxxxxxxxxxxx.appspot.com",
}
opt := option.WithCredentialsFile("./config/serviceAccountKey.json")
app, err := firebase.NewApp(context.Background(), configStorage, opt)
if err != nil {
log.Error(err)
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
client, err := app.Storage(context.Background())
if err != nil {
log.Error(err)
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
bucket, err := client.DefaultBucket()
if err != nil {
log.Error(err)
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
docName := user.ID + "/" + user.ID + "_" + newID + filepath.Ext(header.Filename)
// upload it to google cloud store
go func() {
wc := bucket.Object(docName).NewWriter(context.Background())
if _, err = io.Copy(wc, uploadedFile); err != nil {
log.Error(err)
return
}
err = wc.Close()
if err != nil {
log.Error(err)
}
}()
//******* DOWNLOAD ********
// downloads a file from cloud
func downloadFromCloudStorage(fileURI string) ([]byte, error) {
configStorage := &firebase.Config{
StorageBucket: "fxxxxxxxxxxx.appspot.com",
}
opt := option.WithCredentialsFile("./config/serviceAccountKey.json")
app, err := firebase.NewApp(context.Background(), configStorage, opt)
if err != nil {
return nil, err
}
client, err := app.Storage(context.Background())
if err != nil {
return nil, err
}
bucket, err := client.DefaultBucket()
if err != nil {
return nil, err
}
rc, err := bucket.Object(fileURI).NewReader(context.Background())
if err != nil {
return nil, err
}
defer rc.Close()
data, err := ioutil.ReadAll(rc)
if err != nil {
return nil, err
}
return data, nil
}
//--------- S3 -----------
sess, err := session.NewSession(&aws.Config{Region: aws.String("ca-central-1"),
S3ForcePathStyle: aws.Bool(true), LogLevel: aws.LogLevel(aws.LogDebugWithRequestErrors),
Credentials: credentials.NewStaticCredentials("XXXXXXXXX", "YYYYYYYYYYYYYYYYYYYYYY/", "")})
if err != nil {
panic(err)
}
s3client := s3.New(sess)
file, err := os.Open("testfile.jpg")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close()
fileInfo, _ := file.Stat()
var size = fileInfo.Size()
buffer := make([]byte, size)
// read file content to buffer
file.Read(buffer)
fileBytes := bytes.NewReader(buffer) // convert to io.ReadSeeker type
fileType := http.DetectContentType(buffer)
path := file.Name() // you can add folder by "/examplefolder/"
params := &s3.PutObjectInput{
Bucket: aws.String(bucketName), // required
Key: aws.String(path), // required
ACL: aws.String("public-read"),
Body: fileBytes,
ContentLength: aws.Int64(size),
ContentType: aws.String(fileType),
Metadata: map[string]*string{
"Key": aws.String("MetadataValue"), //required
},
// see more at http://godoc.org/github.com/aws/aws-sdk-go/service/s3#S3.PutObject
}
result, err := s3client.PutObject(params)
if err != nil {
if awsErr, ok := err.(awserr.Error); ok {
// Generic AWS Error with Code, Message, and original error (if any)
fmt.Println(awsErr.Code(), awsErr.Message(), awsErr.OrigErr())
if reqErr, ok := err.(awserr.RequestFailure); ok {
// A service error occurred
fmt.Println(reqErr.Code(), reqErr.Message(), reqErr.StatusCode(), reqErr.RequestID())
}
} else {
// This case should never be hit, the SDK should always return an
// error which satisfies the awserr.Error interface.
fmt.Println(err.Error())
}
}
fmt.Println(awsutil.StringValue(result))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment