Announcement by 이재철 · Jul 24, 2025 at 10:20 AM 📢 사진/보이스 업로드 완료 CleanShot 2025-07-24 at 19.18.48@2x.jpg 65 KB • Download <사진>generateImageUploadUrl -> 업로드(http put) -> createImageFromUploadUrl<보이스>generateFileUploadUrl -> 업로드(http put) -> createFileFromUploadUrl사용해보시고 이상 있으면 알려주세요. 👍 Comments & Events 이재철, Backend 김기범 보이스는 잘 되는데, 이미지 업로드는 PUT으로는 안되는것 같아서 리서치 중입니다. ✅ Jul 25, 2025 at 2:00 AM Notified 3 people 이재철, Backend CleanShot 2025-07-25 at 14.19.51@2x.jpg 112 KB • Download 똑같은 Cloudflare 서비스지만, R2 는 AWS S3 호환성을 위해 PUT 을 사용하고, Images 는 자신들의 컨벤션인 POST 를 사용하는 식이라 혼동이 있었네요. Jul 25, 2025 at 5:20 AM Notified 3 people 이재철, Backend 아래는 Elixir 코드인데, 참고하시라고 올려둡니다.POST에서는 multipart form data 로 처리하고,PUT에서는 raw binary 로 처리하면 되더군요. PUT 방식 (보이스 업로드시) def upload_to_url(url, file_path) do %{status: 200} = Tesla.put!( Tesla.client([Tesla.Middleware.JSON]), url, file_path |> File.read!() ) :ok end POST 방식 (이미지 업로드시) def upload!(path) do filename = Path.basename(path) multipart = Tesla.Multipart.new() |> Tesla.Multipart.add_file(path, name: "file", filename: filename) |> Tesla.Multipart.add_field("requireSignedURLs", "true") %{ body: %{ "success" => true, "result" => %{ "id" => image_id } } } = Tesla.post!( client(), "/client/v4/accounts/#{account_id()}/images/v1", multipart, headers: headers() ) image_id end Jul 25, 2025 at 5:23 AM Notified 3 people
이재철, Backend 김기범 보이스는 잘 되는데, 이미지 업로드는 PUT으로는 안되는것 같아서 리서치 중입니다. ✅ Jul 25, 2025 at 2:00 AM Notified 3 people
이재철, Backend CleanShot 2025-07-25 at 14.19.51@2x.jpg 112 KB • Download 똑같은 Cloudflare 서비스지만, R2 는 AWS S3 호환성을 위해 PUT 을 사용하고, Images 는 자신들의 컨벤션인 POST 를 사용하는 식이라 혼동이 있었네요. Jul 25, 2025 at 5:20 AM Notified 3 people
이재철, Backend 아래는 Elixir 코드인데, 참고하시라고 올려둡니다.POST에서는 multipart form data 로 처리하고,PUT에서는 raw binary 로 처리하면 되더군요. PUT 방식 (보이스 업로드시) def upload_to_url(url, file_path) do %{status: 200} = Tesla.put!( Tesla.client([Tesla.Middleware.JSON]), url, file_path |> File.read!() ) :ok end POST 방식 (이미지 업로드시) def upload!(path) do filename = Path.basename(path) multipart = Tesla.Multipart.new() |> Tesla.Multipart.add_file(path, name: "file", filename: filename) |> Tesla.Multipart.add_field("requireSignedURLs", "true") %{ body: %{ "success" => true, "result" => %{ "id" => image_id } } } = Tesla.post!( client(), "/client/v4/accounts/#{account_id()}/images/v1", multipart, headers: headers() ) image_id end Jul 25, 2025 at 5:23 AM Notified 3 people
똑같은 Cloudflare 서비스지만, R2 는 AWS S3 호환성을 위해 PUT 을 사용하고, Images 는 자신들의 컨벤션인 POST 를 사용하는 식이라 혼동이 있었네요.
POST에서는 multipart form data 로 처리하고,
PUT에서는 raw binary 로 처리하면 되더군요.
PUT 방식 (보이스 업로드시) def upload_to_url(url, file_path) do %{status: 200} = Tesla.put!( Tesla.client([Tesla.Middleware.JSON]), url, file_path |> File.read!() ) :ok end POST 방식 (이미지 업로드시) def upload!(path) do filename = Path.basename(path) multipart = Tesla.Multipart.new() |> Tesla.Multipart.add_file(path, name: "file", filename: filename) |> Tesla.Multipart.add_field("requireSignedURLs", "true") %{ body: %{ "success" => true, "result" => %{ "id" => image_id } } } = Tesla.post!( client(), "/client/v4/accounts/#{account_id()}/images/v1", multipart, headers: headers() ) image_id end