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

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

新規登録して質問してみよう
ただいま回答率
85.49%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

React.js

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

Q&A

3回答

2542閲覧

NodejsでAPI経由で受け取ったファイルを保存する方法

lkl191

総合スコア14

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

React.js

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

0グッド

0クリップ

投稿2022/01/01 14:39

編集2022/01/02 03:01

現在、ファイル共有できるWebアプリを作成しています。

今までで基本的なWebアプリは作ったことがあるのですが、ユーザがファイルをアップロードするような処理は
したことがなかったので、アップされたファイルをどこに保存すればよいのかわからない状態です。

フロントをReactjs、バックエンドをNodejsで作ろうと思います。データベースは未定です。

  1. ファイルはどこに保存するのが一般的か
  2. 他にどのような選択肢があるのか

以上の2点、お教えいただけると幸いです。

追記

今現在、Reactでブラウザから受け取ったファイルをNodejsに送ることは、成功していますがファイルをどこに保存すれば
良いのかわかりません。

自分が調べたところ、データベースにBlob型なりで保存出来るとは知ったのですが、
どのようにファイルを保存するのが一般的かを知りたかったです。

稚拙な文章で申し訳ありませんが、どなたか経験のある方教えていただければ幸いです。

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

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

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

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

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

hoshi-takanori

2022/01/01 16:51

ユーザーがアップロードしたファイルの保存先は、フロントではなくバックエンドの守備範囲かと。あとは、バックエンドをどこで動かすかにもよりますね。EC2 とかなら自由にファイル保存できますが、heroku とかだと永続的なファイル保存はできないので、S3 とか使ったりするようです。
lkl191

2022/01/02 03:04

そうなんですね。ありがとうございます。 ファイルのアップロード機能は難しそうですね。
guest

回答3

0

これは一応の注意喚起になりますが、

世の中にはストレージサービスが大量しますが、
無償・無制限のものは何一つとして存在しません。
何故ならば大挙して超巨大なファイルを入れまくる輩が居るからです。

例えば地デジの生データを抜き出すとTSというファイルになりますが、
30分番組で4GBやそこらになります。
アニメは1クール13話あるので4GB*13話分一気にぶち込むとか。

後は単純所持で違法になるやつですね。
児童ポルノやコンピュータ・ウィルスとか……
杜撰な管理していると捕まるのは質問者さんになります。

ファイルのアップロード・ダウンロードの共有システムを作る場合は
まず「公開範囲」を決定しましょう。

例えば家族だけとか友人とだけとか……
全世界に公開するならシビアな認証・権限管理が必要になります。

その辺りをガチで設計し始めると、AmazonのS3を借りてそのまま使うとか、
そのS3互換のWasabiを借りてそのまま使うとかになりがちです。


今現在、Reactでブラウザから受け取ったファイルをNodejsに送ることは、成功していますがファイルをどこに保存すれば良いのかわかりません。

以上の情報から既にNode.jsのfsを使えばファイルの保存は可能
こういう事は理解していると見受けられるので、
そこから先をどのようにするべきかを見ていきましょう。

自分が調べたところ、データベースにBlob型なりで保存出来るとは知ったのですが、

確かにMySQL等のデータベースにはBlob型というバイナリを保存するのに適した型が存在します。
しかし、ファイルというのは開いて取り出せるものであるべきです。

データベースには保存先のPATHを文字列として格納しておくくらいに留め、
ファイルの実体はHDDやSSDに直接保存しましょう。

まぁ、預かったSSHの認証鍵をZIP圧縮して放り込んでおくみたいな使い方はありかな?
MySQLはアカウント毎に閲覧出来るテーブルを管理出来るので、
職場で管理しているなら上司だけが閲覧出来るテーブルにそういう情報を格納し、
一般の開発者は何を間違っても顧客のSSHの認証鍵を見ちゃったみたいな事はなくなるので犯人探しが楽になりそう。

どのようにファイルを保存するのが一般的かを知りたかったです。

現場により様々です。

自社でサーバマシンを準備するオンプレ・ハウジング等では
外付けHHD・SSDや、ケースを開いてHDD・SSDを増設します。
参考記事: この1ページで一通りわかる!Linuxのマウント(mount)について

「/」のしたであればほぼどこのディレクトリでも枝を追加することは可能だ。一般的に「/mnt」もしくは「/media」にマウントすることが多い。

Node.jsのserver.jsに/mnt/files/何とかかんとかみたいに
文字列の変数でベタ書きしてしまうと汎用性がなくなるので
環境変数かconfig.jsonみたいなファイルを用意して参照する形になります。

Node.jsはprocess.env.MEDIAにアクセスすると環境変数MEDIAの文字列を取得出来ます。
MEDIA="/mnt/files/なんとかかんとか node server.js`といった感じで環境変数に値を埋め込みながら実行すると良いでしょう。
Docker等の環境変数を注入しながら起動するような仕組みもあるので普通に使われる手法です。


個人開発でHDDやSSDを組み込んだマシンを公開するバイタリティのある人間は居ないので、
基本的にはクライドストレージで管理することになるでしょう。

参考記事: AWS SDK for JavaScript

Amazon S3に限った話ではありませんが、
こういうNode.jsや他の言語から直接ストレージサービスにファイルを読み書き出来るサービスは沢山存在します。

この場合環境変数やconfigファイルで管理するのはAWSのAPIキーやトークン情報になります。

使うサービス次第になりますし、AWSなんかは組み込むだけでも一大プロジェクトになる長い道のりなので
「Node.js サービス名」で検索しながら挑戦してみてください。

投稿2022/01/02 16:31

miyabi-sun

総合スコア21158

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

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

0

間違っているなら、低評価入れるときに注意して頂けると幸いです……

投稿2022/01/02 15:16

mike2mike4

総合スコア894

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

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

mike2mike4

2022/01/02 15:17

あ、回答欄に書いてしまったー(汗
guest

0

タイトルがReact.jsだけなので、Reactだけ答えますね。

$ npm run build

でビルドすると、buildフォルダができます。
そのフォルダを丸ごとアップロードしてください。
以下の様にアクセスすると表示されます。
http://test.xxx/build/
※/build/は/aaa/とかに変えられます。

もちろん、test.xxx/直下にアップロードするのもありですし、webサーバーのコンフィグ弄ってエイリアス張ってアクセスさせることも可能です。
私はサブディレクトリにしてます。

ご参考まで。

node.jsは識者さんお願いします。

投稿2022/01/01 15:41

mike2mike4

総合スコア894

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問