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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

Node.js

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

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

1回答

2448閲覧

[MUI][React][TypeScript]Windowsの指定したローカルフォルダにCSVファイルを作成したい

yuyan07

総合スコア0

Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

Node.js

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

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

1グッド

0クリップ

投稿2023/02/03 09:44

実現したいこと

下記【環境】下の開発において、
ある画面で【CSV出力】ボタンを押すと、CSVデータを指定されたフォルダに規則的なファイル名(日付時間等含)のCSVファイルを保存(新規作成)する機能を実現させたいです。

前提

【環境】
・WindowsPC
・Node:8.19.3
・MUI(Material UI)5.11.7
・React 18.2.0
・Typescript 4.9.5

上記環境で開発を行っております。
尚、このCSVファイルの中身はMUIのDataGridで表示されているデータを出力する形ではなく、
DataGridで選ばれた行に関する別(DB)テーブルよりデータ取得した内容になります。

まず単純なファイルでのファイル出力でつまずいております。

試してみたこと

様々試しましたが代表的には2パターンを試しました。

① 下記の場合(Webシステムを使ったダウンロード)、
Windowsの「ダウンロードフォルダ」固定でダウンロードされてしまい、
要件を満たしませんでした。

※関数内の処理のみ記載 const blob = new Blob(['テスト用文字'],{type:"text/plain"}); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'filename.txt'; link.click();

② JavaScriptでファイルを作成するスタイル。

 import fs from 'fs';  ※関数内で fs.writeFileSync('test.txt', 'Hello!');

他の方法でもfsを使うと、下記のエラーが発生してしまいます。

Module not found: Error: Can't resolve 'fs' in 'ソースファイルの位置'。

Reactでは'fs'は使えない??

上記のような状況で、WindowsPC内の指定フォルダに、ファイルを出力(作成)することが可能なのか?
どのような形で実現ができるのか?教えて頂けますと幸いです。

よろしくお願いいたします。

y-temp4👍を押しています

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

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

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

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

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

y_waiwai

2023/02/03 13:09

fsってのはなんのことでしょうか
guest

回答1

0

React で実行されるのはクライアントサイドのコードです。そのため、直接 Windows PC 上の指定フォルダにファイルを保存することはできません。しかし、ユーザーがダウンロードフォルダを選択できるようにすることで、要件を満たすことができるかもしれません。

一つの解決策としては、Electron を使ってデスクトップアプリケーションに変換することが考えられます。これにより、Node.js の機能(fs モジュールなど)を直接使用して、指定されたフォルダにファイルを保存できます。

ただし、Electron を使用せずに現在の環境で実装する場合は、次のようにしてみてください。

  1. サーバーサイドのエンドポイントを作成し、クライアントサイドからそのエンドポイントにデータを送信します
  2. サーバーサイドで、受信したデータを CSV ファイルに変換し、指定されたフォルダに保存します
  3. ファイルが保存されたら、サーバーからクライアントに通知し、クライアントはその結果を表示します

サーバーサイドに Node.js を使用している場合は、以下のようなコードを実装して、上記手順を実現できます。

まず、Express を使ってサーバーサイドの API エンドポイントを作成します。

javascript

1 2const express = require('express'); 3const fs = require('fs'); 4const app = express(); 5app.use(express.json()); 6 7app.post('/save-csv', (req, res) => { 8 const data = req.body.data; 9 const filename = 'output-' + new Date().toISOString() + '.csv'; 10 const filePath = '指定されたフォルダのパス/' + filename; 11 12 // dataをCSV形式に変換する処理を実装 13 14 fs.writeFileSync(filePath, data); 15 res.json({ message: 'CSVファイルが正常に保存されました' }); 16}); 17 18app.listen(3001, () => { 19 console.log('Server is running on port 3001'); 20});

次に、クライアントサイドで、API エンドポイントにデータを送信する関数を実装します。

javascript

1async function saveCSVData(data) { 2 const response = await fetch('http://localhost:3001/save-csv', { 3 method: 'POST', 4 headers: { 5 'Content-Type': 'application/json' 6 }, 7 body: JSON.stringify({ data: data }) 8 }); 9 10 const result = await response.json(); 11 alert(result.message); 12}

これで、React からサーバーサイドの API エンドポイントにデータを送信し、サーバーサイドで CSV ファイルを生成し、指定されたフォルダに保存できます。ファイルが正常に保存されたら、サーバーからクライアントに通知が送られ、アプリケーション上でその結果を表示できます。

ただし、この方法ではクライアントサイドとサーバーサイドの間でデータのやり取りが発生し、インターネット環境が必要になります。また、セキュリティ上の問題がある場合がありますので、適切な認証や権限管理を行いましょう。

最後に、クライアント側で CSV 出力ボタンを押したときに saveCSVData 関数が呼び出されるように、ボタンのイベントハンドラを設定します。

javascript

1import React from 'react'; 2 3function App() { 4 // CSV データを生成する関数を実装します。 5 // この例ではダミーデータを使っています。 6 function generateCSVData() { 7 const data = [ 8 ['header1', 'header2', 'header3'], 9 ['row1-1', 'row1-2', 'row1-3'], 10 ['row2-1', 'row2-2', 'row2-3'] 11 ]; 12 return data.map(row => row.join(',')).join('\n'); 13 } 14 15 async function handleExportCSV() { 16 const csvData = generateCSVData(); 17 await saveCSVData(csvData); 18 } 19 20 return ( 21 <div> 22 {/* 他のコンポーネントがここに表示されます */} 23 <button onClick={handleExportCSV}>CSV出力</button> 24 </div> 25 ); 26} 27 28export default App;

このように実装することで、クライアントサイドからサーバーサイドへのデータの送信、サーバーサイドでの CSV ファイルの生成と保存、そしてサーバーからクライアントへの通知を行うことができます。ただし、この方法はクライアントとサーバーの両方を設定する必要があり、状況によってはセキュリティ上の問題も考慮する必要があります。

投稿2023/03/31 08:03

y-temp4

総合スコア67

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問