Upload file to google cloud storage

I want to upload a file to google cloud storage with my phoenix application, i found some github project but i didn’t understand them very well, can any one help me to how doing that please !

I once attempted to use GCS for file uploading using elixir google api but I change a cloud provider since I needed a ecto integration and waffle and s3 integrates well.

As for your question please kindly read the README of elixir google api.

  1. Add google_api_storage and goth to your dependencies
  2. Get your google client id and secret
  3. export the client id and secret as shown below:
export GOOGLE_CLIENT_ID=[YOUR-OAUTH-CLIENT-ID]
export GOOGLE_CLIENT_SECRET=[YOUR-OAUTH-CLIENT-SECRET]
  1. Perform requests
# Obtain an access token using goth
{:ok, token} = Goth.Token.for_scope("https://www.googleapis.com/auth/cloud-platform")
conn = GoogleApi.Storage.V1.Connection.new(token.token)

# Call the Storage V1 API (for example) to list buckets
{:ok, response} = GoogleApi.Storage.V1.Api.Buckets.storage_buckets_list(conn, project_id)

# Print the response
Enum.each(response.items, &IO.puts(&1.id))

You can also checkout the example repo: https://github.com/GoogleCloudPlatform/elixir-samples/tree/master/storage

2 Likes

Is the file generated by the server or by the user? If the file is uploaded by the user, I would not bother uploading the file to your server and then forwarding it to the GCS bucket. Instead, I would generate a signed URL on the server, send that to the browser and let the browser upload the file directly to the bucket.

I describe two variants for creating such a signed URL on gcs_signed_url. The two variants differ in whether your application is running on the Google cloud itself or not.

1 Like

yes that’s exactly my problem i couldn’t know how to “Get your google client id and secret” and also where i suppose write : “export GOOGLE_CLIENT_ID=[YOUR-OAUTH-CLIENT-ID]
export GOOGLE_CLIENT_SECRET=[YOUR-OAUTH-CLIENT-SECRET]”

Please kindly search on your own how to generate google client id and secrets, for starters

  • you head over to API and services
  • click on Credentials
  • click on Create credentials and select OAuth client ID

As for these two

export GOOGLE_CLIENT_ID=[YOUR-OAUTH-CLIENT-ID]
export GOOGLE_CLIENT_SECRET=[YOUR-OAUTH-CLIENT-SECRET]

after you secure you client id and secret, open a new terminal on the current project directory and type those above.

1 Like

i did all this stuff and i got this:

To be honest, I didn’t use OAuth2 for authentication instead I use Google service account. Do you really need to use OAuth2?

1 Like

for me any thing work will be fine, can you please tell me how you did that without OAuth.
Because i have a service account but i didn’t know how to use it and because i am begginer on that i suppose that i make some things wrong

Sure, do you have the service account json file already, if not please secure it first.

Then in your terminal just type:

export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account.json

Then try make a request again and see if it works.

1 Like

i did that at first i didn’t use export cmd because i am in windows:

after that i run my app and i got the same error:

I’m really not sure anymore I never encounter such error when I implement a file upload function to GCS. Have you inspect if there’s a token return from Goth.Token.for_scope. Could you also try using Goth.fetch/1 instead of for_scope.


so now i know i did everything right but it doesn’t work :expressionless:

Maybe you can try this last one, manually specify the service account json path inside config.ex. Currently I’m on a phone right now but you can Goth documentation.

ok i will search how to do that, thanks a lot i appreciate that