2017-02-16 71 views
0

Elixir庫ExAws S3模塊有一個put_object方法,允許您執行文件上傳。ExAws S3 - 獲取上傳文件的URL

%{path: filepath, filename: filename} = %Plug.Upload{...} 
{:ok, contents} = File.read(filepath) 
time = DateTime.utc_now() |> DateTime.to_unix 
path = "#{Mix.env}/#{time}/#{filename}" 

@bucket |> ExAws.S3.put_object(path, contents) |> ExAws.request 
=> {:ok, %{body: "", headers: [{"x-amz-id-2", "someid="}, {"x-amz-request-id", "someid"}, {"Date", "Thu, 16 Feb 2017 19:43:01 GMT"}, {"ETag", "\"sometag\""}, {"Content-Length", "0"}, {"Server", "AmazonS3"}], status_code: 200}} 

但是,我還沒有能夠找出我上傳的文件的URL。使用這個庫,我怎樣才能得到我上傳的文件的URL?

+1

我很確定'ex_aws'不提供這個選項。我將它與'arc'組合使用,並且arc基本上自己生成url,但有時它們是無效的。最好的解決方案是手動檢查你的文件有哪些URL,並根據它構建你自己的'get_url'函數。我發現自己非常喜歡弧,我認真考慮創建自己的S3上傳/下載庫。 – PatNowak

回答

0

一般地,在S3文件遵循模式:

s3://<bucket-name>/<file-key> 

所在的文件密鑰可以包含目錄等。這就是使用S3協議的工具,如AWS cli。

然而,對於HTTP類型的訪問,該模式是

https://s3.amazonaws.com/<bucket-name>/<file-key> 

但是,只有當您啓用了靜態託管在桶中,並允許訪問文件密鑰給誰就給誰應該得到它。這不是默認設置。您需要手動將存儲桶和文件設置爲通過HTTPS通過控制檯或工具包進行讀取。看起來可以用put_bucket_website,put_bucket_acl和/或put_object_acl的組合來處理。