🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Storage

Google Cloud Storageは、グーグル社が提供しているクラウドベースのデベロッパー・企業向けストレージサービス。可用性に優れ、APIで操作可能なため、データのアーカイブ保存やアプリケーションのコンテンツ提供など様々な用途に活用できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

1543閲覧

GCPのstorageに保存した画像を取得し、そのまま再アップロードする方法

KU112

総合スコア1

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Storage

Google Cloud Storageは、グーグル社が提供しているクラウドベースのデベロッパー・企業向けストレージサービス。可用性に優れ、APIで操作可能なため、データのアーカイブ保存やアプリケーションのコンテンツ提供など様々な用途に活用できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/01/28 13:11

実現したいこと

javascriptでWEBからGCPのstorageに保存した画像を取得し、そのまま画像を再アップロードしたいです。

抱えている課題

GCPのstorageに保存した画像のURLは取得できている状態ですが、そのURLの情報から画像としてStorageへ再アップロードする方法が分かりません。

試したことと結果

まず、元々のアップロードは、以下のようにオーソドックスなfile形式で画像をローカルのPCのディスクから選択し、
FileListへ入れてアップロードしています。

・htmlファイル

index.html

1<input type="file" name="datafile" id="logo-img-input"">

・JSファイル

let files = document.getElementById('logo-img-input').files; let image = files[0]; let file_path = "xxx.jpg"; ///画像アップロード let ref = firebase.storage().ref().child(file_path); ref.put(image, metadata).then(function(snapshot) { alert('アップロードしました'); });

ではこのアップロードした画像を次に取得する方に関して、
まず上記コードでは省略していますが、httpから始まるURLを事前に取得してDBに保存してあり、
現状はDBから直接読んでいるので、画像までのURLは持っている状態です。
こちらのURLより、再度画像を取得し、そのまま特に画像には手を加えずアップロードができる状態にしたいです。

試したこととしては、今はファイル形式のinputのパターンをそのまま再現すればコードもそのまま使用できるため都合が良いと考え、仮に今このURLを
https://storage.cloud.google.com/xxx.jpg
とすると、

JSファイル

/// fileを作成 let file = new File([], 'https://storage.cloud.google.com/xxx.jpg', { lastModified: new Date(2017, 1, 1), type: "image/jpeg", }); ///FileListの形式にする const dt = new DataTransfer(); dt.items.add(file); const fileList = dt.files; console.log("fileList : ", fileList); let image = fileList[0]; let file_path = "xxx.jpg"; ///画像アップロード let ref = firebase.storage().ref().child(file_path); ref.put(image, metadata).then(function(snapshot) { alert('アップロードしました'); });

としても、FileListの出力が以下のようにsizeが0になってしまって、うまく取り込めていないようです。
(inputから画像を入れた時は、これとの差分はsizeにファイルサイズ(バイト数)が入っていることくらいしかなさそうでした。)

File {name: "https://storage.cloud.google.com/xxx.jpg", lastModified: 1485874800000, lastModifiedDate: Wed Feb 01 2017 00:00:00 GMT+0900 (日本標準時), webkitRelativePath: "", size: 0, …}

lastModified: 1485874800000
lastModifiedDate: Wed Feb 01 2017 00:00:00 GMT+0900 (日本標準時) {}
name: "https://storage.cloud.google.com/xxx.jpg"
size: 0
type: "image/jpeg"
webkitRelativePath: ""
proto: File

また、念のためアップロードされたファイルを見てみても、一応jpgファイルとして扱われているようですが、ファイルサイズが0KBで保存されており、DLしてもからの異常なファイル扱いで表示されませんでした。

Blob形式を使えば何とかできるのかもしれないとは思ったのですが、
Blobの取り扱いをしたことがなく、GCP Storageの画像情報をどう扱えば良いのかよく分かりませんでした。

一方で、imgタグのimg.srcに上記のパスを入れると正しく画像が表示されることは確認できました。
例えばこのimgタグから、inputしてFileListへ追加するようなことができても解決となりますが、その方法もよく分かりませんでした。

背景

一応上記のようなことを行いたい背景としては、現在アカウント登録/管理のシステムを作っていて、
初めに一度画像を登録したあとに、登録した情報を編集する際、画像自体も編集する場合は新しいもので登録するだけなので良いのですが、画像以外の情報を更新して、画像には変更がない場合は前回のものをそのままアップロードして最新のデータとする。といった仕組みにしたいと考えております。

こちらずっと解決できず、どなたか解決策がお分かりになる方がいらっしゃいましたら、
大変お手数ですが、ご教授いただけると大変助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まったく何も試しておりませんが、

var img = document.getElementById('myimg');

で参照できるようにして、btoa などでバイト列に変換し、
https://firebase.google.com/docs/storage/web/upload-files?hl=ja
の バイト配列からアップロードする、とかはどうでしょうか。

投稿2021/01/28 13:27

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KU112

2021/01/28 13:39 編集

68userさん ありがとうございます!大変助かります! btoaの使い方はまだ良く分かっていませんが、色々と触ってみようと思います!
KU112

2021/01/28 14:49

なるほどです。こちらの文字列の方でも画像が扱えるのですね。 (ここは画像は関係ないと勘違いしておりました。。) チャレンジしてみます。本当にありがとうございますm(_ _)m
KU112

2021/01/29 16:05

ありがとうございます!試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問