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

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

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

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

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

JavaScript

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

解決済

サーバー上の.asarファイルをhttpとfsでローカルにダウンロードする方法

dimyas
dimyas

総合スコア16

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

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

JavaScript

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

1回答

0評価

0クリップ

372閲覧

投稿2022/06/06 14:11

編集2022/06/12 09:09

やりたいこと

  • Webサーバー上にあるasarファイルをNode.jsのfsモジュールとhttpモジュールでローカルにダウンロードしたい
  • requestモジュールで実装していたが、requestは非推奨のため、今後の保守のことも考えfshttp(今後非推奨になることが恐らくない)モジュールだけで実装したい

現状

  • Web記事上にあるfshttpでバイナリ(画像)ファイルをダウンロードする方法のコードを写してasarファイルで試してみたが、createWriteStreamで生成されたファイルに中身がパイプで入れられれいなかった。
  • 上記の方法では画像ファイルは問題なくダウンロードできた

以下コード例

// originalfs = original-fs var downloadFile = function (url, dest, cb) { var file = originalfs.createWriteStream(dest); https.get(url, function (res) { //res.setEncoding('binary'); res.pipe(file); file.on('finish', function () { res.pipe(file); console.log('finish'); file.close(cb); }); }); }; // 変数urlは省略 downloadFile(url, 'rendertest.asar', function (err) { console.log('end'); console.log(err); });

疑問

  • なぜ画像はできたのにasarファイルはできないのか?
  • asarファイルはバイナリファイルではないのか?
  • asarファイルはrequestでしかダウンロードできないのか?
  • node-fetch / axios / got等、どのモジュールでやるのがいいのか?

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

追加

画像はできたのにasarファイルはできなかった原因について

画像はネット上のもの(普通のサーバーにある)を引っ張ってきたがasarファイルはGoogle Drive上でdrv.twを使いホスティングしていたのが原因

ローカルホストのサーバーからならasarファイルはダウンロードできた。

Google Driveの使用した流れについて

ホスティングしたサイトのURLに行ってファイルをダウンロードしようとすると、このようなページが表示される

イメージ説明

このままだとダウンロードできないので、開発者ツールから「このままダウンロード」のところのformタグのaction属性を見ることにした。

イメージ説明

POSTのフォームタグで、GETのパラメータがあるURLだが、このURLにアクセスしたらファイルがダウンロードできたので、requestモジュールでこのURLを指定してasarファイルをダウンロードすることができた

問題はこのURLでhttp.getでアクセスした時になぜか303のステータスコードになってダウンロードできないことである

このURLでもrequestならダウンロードできたので、303が出ても何かしらの処理をしてダウンロードができる??

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

dimyas

2022/06/06 14:25

Electronでフロント部分だけを差し替える、簡易アップデート機能を実装するにあたって、この問題にぶつかりました。
miyabi-sun

2022/06/07 04:22

> node-fetch / axios / got等、どのモジュールでやるのがいいのか? httpでやりたいのか、やりたくないのか どっちなんだい? Node.jsは18系以降Fetchが標準搭載されるのでFetchで良いのでは? https://forest.watch.impress.co.jp/docs/news/1404310.html 今使ってるNode.jsのバージョンがそれ以下なら18系が参考にしているundiciや fetchをNode.jsに持ってくる思想で作られたnode-fetch等で良いでしょうかね
dimyas

2022/06/07 13:28

> httpでやりたいのか、やりたくないのか > どっちなんだい? httpでやりたいです。 それでも無理な場合はfetchでやろうと思います。
dimyas

2022/06/08 22:45

一度asarファイルをローカルホストのサーバーにおいてダウンロードを試してみたらできました。 元々asarファイルはGoogle DriveでDriveToWeb(drv.tw)を使ってホスティングしていたので、それが原因かもしれないです。
miyabi-sun

2022/06/09 01:37

うーむ、だったらサーバがステータスコードでリダイレクトを示す300系を返してる可能性ありますね。 https://developer.mozilla.org/ja/docs/Web/HTTP/Status 多くのダウンロード系のモジュールは300系のリダイレクトがあった場合、 リダイレクト先に接続し直して取得を試みてくれますが、原始的なhttpモジュールだとそこのケアが足りない可能性はあります。
dimyas

2022/06/10 02:34

はい、ステータスコード見てみたら303が返ってきていました
dimyas

2022/06/10 03:37

同じリンクでもrequestモジュールならダウンロードできてたので、何かしらの処理が必要みたいですね それか大きいファイルだとダウンロードに警告のページ挟まれるGoogle Driveじゃなくて、有料のレンタルサーバーや他のホスティングできるサービス使うしかなさそうですね 質問も編集したのでよければ確認お願いします。
miyabi-sun

2022/06/10 04:01

リダイレクトを示す300系のステータスコードの場合 レスポンスの中身に「このURLへ行け」という指示(新しいURL)が入っているはずです。 https://github.com/request/request/blob/master/index.js#L42 https://github.com/request/request/blob/master/index.js#L143 https://github.com/request/request/blob/master/request.js#L285 https://github.com/request/request/blob/master/lib/redirect.js#L45 オブジェクト指向的にごちゃごちゃしててイマイチ追い切れませんが、 requestモジュールには300系ならば、新しいURLに向けてもう一度リクエストを試みるという趣旨のコードが格納されています。 この辺のケアも含めて既存のITエンジニアは既製品のモジュールを使っており こういうhttpみたいなモジュールは使ってないので回答出来ません。 自力で切り開く必要があります。
dimyas

2022/06/10 04:27

レスポンスのheaders.locationに新しいURLが入っていたので、303だった場合はそこからダウンロードするようにすればいけそうです!! ありがとうございます!!

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Node.js

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

JavaScript

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