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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

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

Q&A

解決済

1回答

3965閲覧

Reactとmulterとexpressを使って画像をアップロードしたい

kouki_1997

総合スコア10

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

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

0グッド

0クリップ

投稿2019/03/16 12:21

編集2019/03/17 05:07

前提・実現したいこと

Reactとmulterとexpressを使って画像をアップロードしたいのですが、以下のようなエラーが発生します。

発生している問題・エラーメッセージ

エラーメッセージです。

TypeError: Cannot read property 'originalname' of undefined

変数の未定義とかではなく「originalname」のスペルミスをしているわけでもなく、おそらく画像がpostできていないのだと思います。。。

該当のソースコード

http://localhost:3001/upload」にアクセスした場合は、React Routerによって以下のコンポーネントを描画します。
ファイルをPOSTするためのフォームを描画するのみとなっています。
upload.js

javascript

1import React, {Component} from 'react' 2import request from 'superagent' 3 4// 5export default class Upload extends Component { 6 return ( 7     <div> 8 <h1>プロフィール編集</h1> 9 <form method="POST" action="/upload" enctype="multipart/form-data"> 10 <input type="file" id="image" name="aFile" /><br /> 11 <input type="submit" value="アップロードするよ" /> 12 </form> 13 </div> 14 ) 15 } 16}

expressを使って、フォームからPOSTされた画像をmulterを使って取得するコードです。
server.js

javascript

1const multer = require('multer') 2const path = require('path') 3const storage = multer.diskStorage({ 4 // ファイルの保存先を指定 5 destination: (req, file, cb) => { 6 cb(null,pubDir); 7 }, 8 // ファイル名を指定(オリジナルのファイル名を指定) 9 filename: (req, file, cb) => { 10 cb(null, file.originalname); 11 } 12}); 13 14const uploader = multer({dest: tmpDir,storage:storage}) 15 16app.post('/upload', uploader.single('aFile'), (req, res) => { 17する 18 console.log('オリジナルファイル名:', req.file.originalname) 19})

試したこと

もし上記の2つ目(server.js)のサーバーとなるコードの中で、以下のようにsend()を使って直接formタグを書いたら、うまくアップロードされます

javascript

1app.get('/upload', (req, res) => { 2 res.send( 3 '<h1>プロフィール画像編集</h1>' + 4 '<form method="POST" action="/" enctype="multipart/form-data">' + 5 '<input type="file" name="aFile" /><br />' + 6 '<input type="submit" value="アップロード" />' + 7 '</form>') 8})

もちろん、上記のようなformタグが書かれたhtmlファイルによるフォームから送信したらpostが成功します。

しかし、今回はどうしてもupload.jsのReactのコンポーネントの中のreturn()の中でformタグを書いて処理がしたいのです。

また、このサイト
http://mk.hatenablog.com/entry/2015/11/06/125133
を参考にして、SuperAgentを使ってpostしたりしてみたのですが、だめでした。

補足情報(FW/ツールのバージョンなど)

利用しているもののバージョンです。
"react": "^15.5.4",
"react-dom": "^15.5.4",
"react-router-dom": "^4.3.1",
"express": "^4.15.3",
"multer": "^1.4.1",

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

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

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

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

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

guest

回答1

0

自己解決

このサイト
https://medium.com/@mahesh_joshi/reactjs-nodejs-upload-image-how-to-upload-image-using-reactjs-and-nodejs-multer-918dc66d304c

を参考にして、axiosというライブラリ使ったらあっさり自己解決できました。。。。

投稿2019/03/17 05:50

編集2019/03/18 04:48
kouki_1997

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問