質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

1911閲覧

URLから画像か否かを判定したい

whoiwhoi

総合スコア48

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/05/02 23:38

前提・実現したいこと

inputフォームでURLの入力を受け付け、入力されたURLが画像か否かを判定したいです。
また、画像のURLの末尾が拡張子では無い画像のURLも存在するので、拡張子の有無で画像の判定は行なわない方法で、画像か否かを判定したいです。

試したこと・発生している問題

URLに画像の拡張子が無い場合もあるのでURLから判定するのは不可能と考え、getして帰ってきたレスポンスから画像か否かを判定する材料があるかもしれないと思い、とりあえずAxiosを使ってレスポンスを調べてみました。

下記はReactを使った動作デモです。
CodeSandBox

結果、レスポンスのヘッダーにcontent-type":"image/jpegというものが含まれていたので、image/jpegやimage/pngかどうかで、判定ができそうだと思いました。

しかしcontent-typeというプロパティ名にはハイフンが含まれており、content-typeの値を参照することができませんでした。


ただ、拡張子の有無を問わず画像か否かを判定できればよいので、上記の私が試した方法ではないアプローチでよいものがあれば、ご教示いただきたいです。

該当のソースコード

JavaScript

1export default function App() { 2 const [header, setHeader] = useState(""); 3 const [isImg, setIsImg] = useState(); 4 const checkImg = async ({ target: { value } }) => { 5 if (!value) return; 6 7 const res = await axios.get(value); 8 setHeader(JSON.stringify(res.headers)); 9 10 // 画像か否かを判定 11 // setIsImg() 12 }; 13 14 return ( 15 <div className="App"> 16 <div> 17 画像のURLサンプル 18 <input 19 type="text" 20 defaultValue="https://images.unsplash.com/photo-1651417060303-716ae896ef88?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxlZGl0b3JpYWwtZmVlZHw1fHx8ZW58MHx8fHw%3D&auto=format&fit=crop&w=500&q=60" 21 /> 22 </div> 23 <div> 24 画像のURL入力フォーム 25 <input type="url" onChange={checkImg} /> 26 </div> 27 <h2>画像か否かの判定結果</h2> 28 <p> 29 {isImg === true && "画像です。"} 30 {isImg === false && "画像ではありません。"} 31 </p> 32 <h2>ヘッダーのレスポンス</h2> 33 <pre>{header}</pre> 34 </div> 35 ); 36}

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

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

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

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

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

hoshi-takanori

2022/05/02 23:52

res.headers["content-type"] とか? あと、content-type だけ知りたい (画像データ自体は不要) なら axios.head を使うと良いかも。
whoiwhoi

2022/05/03 00:05

res.headers["content-type"]でcontent-typeの値を取得できました。 カッコでプロパティ名を指定して値を取得する方法とaxios.headは知らなかったので勉強になりました。 ありがとうございました。
guest

回答2

0

このようなやり方もあります

<script> window.onload=function(){ input = document.createElement('input'); input.type="text"; input.id="url"; document.body.appendChild(text); var input = document.createElement('input'); input.type="button"; input.value="画像か判定"; input.addEventListener("click",function(){ img = document.createElement('img'); img.src=document.getElementById("url").value; img.style.display="none"; img.addEventListener("load",function(){ alert("画像である"); }); img.addEventListener("error",function(){ alert("画像ではない"); }); document.body.appendChild(img); }); document.body.appendChild(text); } </script>

投稿2022/05/03 00:25

ptaxrt

総合スコア22

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

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

whoiwhoi

2022/05/03 00:48 編集

動作サンプルと異なりますが、corsの問題で実際はnode.jsでaxiosを実行してたんですけど、クライアント側のバリデーションがいるなーと思っていたのでご教示いただき助かります。 imgタグのsrcに入力された文字列を入れる→読み込めたら画像、読み込めなかったら画像じゃない、ってことですね。 ↓ご教示いただいた方法で画像の判定ができました。 https://jsbin.com/zevojiwobi/edit?html,css,js,output
guest

0

自己解決

質問文についたhoshi-takanoriさんのコメントを参照してください。

javascript

1res.headers.content-type

javascript

1res.headers["content-type"]

これでimage/jpegやimage/pngなどの値が取得でき、URLから画像の判定ができるようになりました。

投稿2022/05/03 00:09

whoiwhoi

総合スコア48

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問