node.jsを使用して画像をアップロード、表示、保存し、表現する方法[終了]


104

ローカルホストを更新したときに失われないように、画像をアップロードして表示し、保存する必要があります。これは、ファイルの選択を要求する「アップロード」ボタンを使用して行う必要があります。

私はnode.jsを使用しており、サーバーサイドコードを表現しています。


4
ここを見て、FAQどのような質問をする必要があるかを確認してください。とにかく、今回は質問にお答えします。
fardjad

103人のユーザーは、この質問があいまい、あいまい、不完全、過度に広い、または修辞的であるとは考えていません。面白い。;)
アンドレアス

回答:


227

まず、ファイルのinput要素を含むHTMLフォームを作成する必要があります。また、フォームのenctype属性をmultipart / form-data設定する必要があります

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="file" name="file">
    <input type="submit" value="Submit">
</form>

フォームが、スクリプトが置かれている場所を基準にしてpublicという名前のディレクトリに格納されているindex.htmlで定義されていると仮定すると、次のように提供できます。

const http = require("http");
const path = require("path");
const fs = require("fs");

const express = require("express");

const app = express();
const httpServer = http.createServer(app);

const PORT = process.env.PORT || 3000;

httpServer.listen(PORT, () => {
  console.log(`Server is listening on port ${PORT}`);
});

// put the HTML file containing your form in a directory named "public" (relative to where this script is located)
app.get("/", express.static(path.join(__dirname, "./public")));

これが完了すると、ユーザーはそのフォームを介してサーバーにファイルをアップロードできるようになります。ただし、アプリケーションでアップロードされたファイルを再構成するには、リクエスト本文を(マルチパートフォームデータとして)解析する必要があります。

ではエクスプレス3.xでは、あなたは使用することができexpress.bodyParser、マルチパートフォームを処理するためのミドルウェアをが、のようエクスプレス4.xでは、フレームワークにバンドルされて何のボディパーサーありません。幸いなことに、利用可能な多数のmultipart / form-dataパーサーの 1つから選択できます。ここでは、multerを使用します

フォーム投稿を処理するためのルートを定義する必要があります:

const multer = require("multer");

const handleError = (err, res) => {
  res
    .status(500)
    .contentType("text/plain")
    .end("Oops! Something went wrong!");
};

const upload = multer({
  dest: "/path/to/temporary/directory/to/store/uploaded/files"
  // you might also want to set some limits: https://github.com/expressjs/multer#limits
});


app.post(
  "/upload",
  upload.single("file" /* name attribute of <file> element in your form */),
  (req, res) => {
    const tempPath = req.file.path;
    const targetPath = path.join(__dirname, "./uploads/image.png");

    if (path.extname(req.file.originalname).toLowerCase() === ".png") {
      fs.rename(tempPath, targetPath, err => {
        if (err) return handleError(err, res);

        res
          .status(200)
          .contentType("text/plain")
          .end("File uploaded!");
      });
    } else {
      fs.unlink(tempPath, err => {
        if (err) return handleError(err, res);

        res
          .status(403)
          .contentType("text/plain")
          .end("Only .png files are allowed!");
      });
    }
  }
);

上記の例では、/ uploadに投稿された.pngファイルは、スクリプトが配置されている場所を基準にアップロードされたディレクトリに保存さます。

アップロードされた画像を表示するには、img要素を含むHTMLページがすでにあると仮定します。

<img src="/image.png" />

Expressアプリで別のルートを定義しres.sendFile、保存された画像を提供するために使用できます。

app.get("/image.png", (req, res) => {
  res.sendFile(path.join(__dirname, "./uploads/image.png"));
});

92
あなたは紳士で学者です
mattdlockyer '

9
'req.files'または 'req.body'にアクセスしようとしている人は、body-parserがJSONのみを処理するようになりました。github.com/ expressjs / multerを
Scott Meyers

5
「app.use(express.bodyParser({uploadDir: '...'}));」のように 「app.use(bodyParser({uploadDir: '...'}));」を使用する必要があります。そのため、body-parserはnpmを介して追加し、「var bodyParser = require( 'body-parser');」を介して使用するファイルに追加する必要があります。
Niklas Zantner、2015年

4
これをExpress 4でどのように実行できますか?
Muhammad Shahzad

4
@fardjad間に角度がある場合はどうなりますか?
Gaurav51289
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.