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.
- Add
google_api_storage
andgoth
to your dependencies - Get your google client id and secret
- 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]
- 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
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.
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.
To be honest, I didn’t use OAuth2 for authentication instead I use Google service account. Do you really need to use OAuth2?
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.
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
.
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