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

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

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

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

Q&A

解決済

1回答

1739閲覧

reactのaxiosを使って送信する画像を表示したい。

hiei1

総合スコア52

React.js

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

0グッド

0クリップ

投稿2022/06/09 05:25

reactのaxiosを使って画像を送信するときに画像を画面に表示したいです。そしてAPIから文字列が返ってくるのですがこの文字列も帰ってきたら表示したいです。

質問したいこと

  1. 送信する画像をどのように表示すればいいですか?
  2. 文字列を画像を表示しながらその下に表示するのはどのようにすればいいですか?

現在のコード

fileupload.js

1import React from 'react' 2import axios from 'axios'; 3 4class FileUpload extends React.Component{ 5 constructor(){ 6 super(); 7 this.state = { 8 selectedFile:'', 9 } 10 11 this.handleInputChange = this.handleInputChange.bind(this); 12 } 13 14 handleInputChange(event) { 15 this.setState({ 16 selectedFile: event.target.files[0], 17 }) 18 } 19 20 submit(){ 21 const data = new FormData() 22 23 data.append('file', this.state.selectedFile) 24 console.warn(this.state.selectedFile); 25 let url = "http://localhost:8000/upload.php"; 26 27 axios.post(url, data, { // receive two parameter endpoint url ,form data 28 }) 29 .then(res => { // then print response status 30 console.log(res.data) 31 }) 32 33 } 34 35 render(){ 36 return( 37 <div> 38 <div className="row"> 39 <div className="col-md-6 offset-md-3"> 40 <br /><br /> 41 42 <h3 className="text-white">React File Upload Example - Tutsmake.com</h3> 43 <br /> 44 <div className="form-row"> 45 <div className="form-group col-md-6"> 46 <label className="text-white">Select File :</label> 47 <input type="file" className="form-control" name="upload_file" onChange={this.handleInputChange} /> 48 </div> 49 </div> 50 51 <div className="form-row"> 52 <div className="col-md-6"> 53 <button type="submit" className="btn btn-dark" onClick={()=>this.submit()}>名前確認</button> 54 </div> 55 </div> 56 </div> 57 </div> 58 </div> 59 ) 60 } 61} 62 63export default FileUpload;

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

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

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

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

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

guest

回答1

0

ベストアンサー

単純に読み込んだ画像を表示するといった場合、axiosは関係ありません。

imgタグを用意して、ファイル読み取り後にその結果をsrcに設定すると画像表示ができます。
掲示いたしましたソースを調整しfileのchangeイベント等に適宜設定することで表示可能になるかと思います。

文字列については、追加したimgに合わせてdivやspanなどを用意してそこに表示したい文字列を差し込めばよいかと思います。

javascript

1const files = document.querySelector('input[type=file]').files; // 選択されているファイルを取得 2const file = this.files[0]; 3const reader = new FileReader(); 4reader.onload = function (e) { 5 // ファイルの読み込みが完了した後、用意したimgに設定 6 document.querySelector("img").attr("src", e.target.result); 7}; 8// ファイル読み込み 9reader.readAsDataURL(file);

補足

ファイルの扱いについて
エレメントのfilesはFileオブジェクトはBlob形式のオブジェクトで今回のケースのように扱うにはロードしてあげなければなりません。
MDN Web Docs(File)

そのロードはFileReaderを用いて行います。
MDN Web Docs(FileReader)

今回のケースでは、「FileReader.readAsDataURL」を使用します。
このファンクションの引数としてFileオブジェクトを渡してやります。

javascript

1reader.readAsDataURL(file);

すると、このFileReaderの「onload」イベントが発火するので、ファイルの扱いたい情報はこの「onload」イベントに実装します。

javascript

1reader.onload = function (e) { 2 // ファイルの読み込みが完了した後、用意したimgに設定 3 document.querySelector("img").attr("src", e.target.result); 4};

ここで注意すべきことは、処理をイベントないに書くため、非同期的な処理として動作することです。

投稿2022/06/09 05:42

編集2022/06/09 07:02
Matsumon0104

総合スコア1005

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

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

hiei1

2022/06/09 05:46

初心者ですいません。fileupload.jsにどのようにこのコードを追加したらよいでしょうか。
Matsumon0104

2022/06/09 06:06 編集

まず、htmlに画像を表示するためのタグ(img)を追加し、また、文字列表示用のタグ(spanやdiv等問いません)を用意してください。 掲示したスクリプトの実装は、実装要件によりますが、ファイル選択時にサムネイルとして表示したい場合は、ファイルのchangeイベントである「handleInputChange」に実装してください。 表示文字列は、axiosのレスポンスを受け取っているところで処理してください。 .then(res => { // then print response status console.log(res.data) })
hiei1

2022/06/09 06:17

return の中に<img>タグと文字列表示用のタグを追加するということでしょうか?
Matsumon0104

2022/06/09 06:19

ご掲示いただいた「FileUpload」のコンポーネント内で問題ないのであれば、「return」内でよいかと思います。
hiei1

2022/06/09 06:25

import React from 'react' import axios from 'axios'; class FileUpload extends React.Component{ constructor(){ super(); this.state = { selectedFile:'', } this.handleInputChange = this.handleInputChange.bind(this); } handleInputChange(event) { this.setState({ selectedFile: event.target.files[0], name: event.target.data, }) const files = document.querySelector('input[type=file]').files; // 選択されているファイルを取得 const file = this.files[0]; const reader = new FileReader(); reader.onload = function (e) { // ファイルの読み込みが完了した後、用意したimgに設定 document.querySelector("img").attr("src", e.target.result); }; // ファイル読み込み r.readAsDataURL(f); } submit(){ const data = new FormData() data.append('file', this.state.selectedFile) console.warn(this.state.selectedFile); let url = "http://localhost:8000/upload.php"; axios.post(url, data, { // receive two parameter endpoint url ,form data }) .then(res => { // then print response status this.state.name.append(res.data) }) } render(){ return( <div> <div className="row"> <div className="col-md-6 offset-md-3"> <br /><br /> <h3 className="text-white">React File Upload Example - Tutsmake.com</h3> <br /> <div className="form-row"> <div className="form-group col-md-6"> <label className="text-white">Select File :</label> <input type="file" className="form-control" name="upload_file" onChange={this.handleInputChange} /> </div> <img src= '' > </div> <div className="form-row"> <div className="col-md-6"> <button type="submit" className="btn btn-dark" onClick={()=>this.submit()}>名前確認</button> </div> </div> </div> </div> </div> ) } } export default FileUpload; このような感じでしょうか?
Matsumon0104

2022/06/09 06:33

エレメント取得時のセレクタを間違えなければどこにおいても大丈夫です。
hiei1

2022/06/09 06:39

import React from 'react' import axios from 'axios'; class FileUpload extends React.Component{ constructor(){ super(); this.state = { selectedFile:'', name:'' } this.handleInputChange = this.handleInputChange.bind(this); } handleInputChange(event) { this.setState({ selectedFile: event.target.files[0], name: event.target.data, }) } submit(){ const data = new FormData() data.append('file', this.state.selectedFile) console.warn(this.state.selectedFile); let url = "http://localhost:8000/upload.php"; axios.post(url, data, { // receive two parameter endpoint url ,form data }) .then(res => { // then print response status this.state.name.append(res.data) }) } render(){ return( <div> <div className="row"> <div className="col-md-6 offset-md-3"> <br /><br /> <h3 className="text-white">React File Upload Example - Tutsmake.com</h3> <br /> <div className="form-row"> <div className="form-group col-md-6"> <label className="text-white">Select File :</label> <input type="file" className="form-control" name="upload_file" onChange={this.handleInputChange} /> </div> <img src={this.selectedFile}/> <div> {this.name}</div> </div> <div className="form-row"> <div className="col-md-6"> <button type="submit" className="btn btn-dark" onClick={()=>this.submit()}>名前確認</button> </div> </div> </div> </div> </div> ) } } export default FileUpload; このようにしたのですが画像が表示されません
Matsumon0104

2022/06/09 07:01

ファイルの扱いについて回答文に補足を追記しました。 ご参考になればと思います。
hiei1

2022/06/09 07:37

ありがとうございます。
hiei1

2022/06/09 08:15

できたのですがresizeのやり方わかりますか?
Matsumon0104

2022/06/09 08:20

画像のリサイズということだと思いますが、 エレメント自体のリサイズですか?それとも、表示される画像のリサイズですか?
hiei1

2022/06/09 08:41

すいません文字足らずでした。表示される画像のリサイズです。 import React from 'react' import axios from 'axios'; import { render } from 'react-dom' class FileUpload extends React.Component{ constructor(){ super(); this.state = { selectedFile:'', name:'', imagePreviewUrl: '' } this.handleInputChange = this.handleInputChange.bind(this); } handleInputChange(event) { event.preventDefault() let reader = new FileReader(); let file = event.target.files[0] reader.onloadend = () => { this.setState({ selectedFile: file, //name: event.target.data, imagePreviewUrl: reader.result }) } reader.readAsDataURL(file) } submit(){ const data = new FormData() data.append('file', this.state.selectedFile) console.warn(this.state.selectedFile); let url = "http://localhost:8000/upload.php"; axios.post(url, data, { // receive two parameter endpoint url ,form data }) .then(res => { // then print response status this.state.name.append(res.data) }) } render(){ return( <div> <div className="row"> <div className="col-md-6 offset-md-3"> <br /><br /> <h3 className="text-white">React File Upload Example - Tutsmake.com</h3> <br /> <div className="form-row"> <div className="form-group col-md-6"> <label className="text-white">Select File :</label> <input type="file" className="form-control" name="upload_file" onChange={this.handleInputChange} /> </div> <img src={this.state.imagePreviewUrl} /> <div> {this.name}</div> </div> <div className="form-row"> <div className="col-md-6"> <button type="submit" className="btn btn-dark" onClick={()=>this.submit()}>名前確認</button> </div> </div> </div> </div> </div> ) } } export default FileUpload; 今はこんな感じにしてます。
Matsumon0104

2022/06/09 08:46

ご回答いただいた内容で、どちらのリサイズがわかりかねますので、 imgエレメントのリサイズ方法について示します。 document.querySelector('img').style.height = xxx; // 高さ document.querySelector('img').style.width = xxx; // 幅 「.style」を利用するとエレメントのスタイルを動的に調整できます。
Matsumon0104

2022/06/09 08:48

また、上記回答が的を得ていない場合、「js 画像 リサイズ」でWeb検索すると いろいろ出てきますので、納得できる答えがあるかもしれません。
hiei1

2022/06/09 09:33

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問