sql >> Databasteknik >  >> NoSQL >> MongoDB

Skicka filer från Amazon S3 genom NodeJS-servern utan att exponera S3 URL?

En kombination av en expressmellanprogramvara (för att kontrollera behörigheten för användaren som gör begäran) och användningen av Node AWS SDK borde göra susen.

Här är ett fullständigt exempel med multer för uppladdningen.

var express = require('express');
var app = express();
var router = express.Router();
var multer = require('multer');
var upload = multer({
  dest: "tmp/"
});
var fs = require('fs');
var async = require('async');
var AWS = require('aws-sdk');
// Configure AWS SDK here
var s3 = new AWS.s3({
  params: {
    Bucket: 'xxx'
  }
});

/**
 * Authentication middleware
 *
 * It will be called for any routes starting with /files
 */
app.use("/files", function (req, res, next) {
  var authorized = true; // use custom logic here
  if (!authorized) {
    return res.status(403).end("not authorized");
  }
  next();
});

// Route for the upload
app.post("/files/upload", upload.single("form-field-name"), function (req, res) {
  var fileInfo = console.log(req.file);
  var fileStream = fs.readFileSync(fileInfo.path);
  var options = {
    Bucket: 'xxx',
    Key: 'yyy/'+fileName,
    Body: fileStream
  };

  s3.upload(options, function (err) {
    // Remove the temporary file
    fs.removeFileSync("tmp/"+fileInfo.path); // ideally use the async version
    if (err) {
      return res.status(500).end("Upload to s3 failed");
    }
    res.status(200).end("File uploaded");
  });
});

// Route for the download
app.get("/files/download/:name", function (req, res) {
  var fileName = req.params.name;
  if (!fileName) {
    return res.status(400).end("missing file name");
  }
  var options = {
    Bucket: 'xxx',
    Key: 'yyy/'+fileName
  };
  res.attachment(fileName);
  s3.getObject(options).createReadStream().pipe(res);
});

app.listen(3000);

Uppenbarligen är detta bara delvis testat och saknar korrekt felhantering - men det borde förhoppningsvis ge dig en ungefärlig uppfattning om hur du ska implementera det.



  1. Hur man gör kapslade frågor i MongoDb som fungerar som kapslade Sql-selekteringsfrågor

  2. PyMongo - välj underdokument från insamling av regex

  3. Mongoose:Cast to date misslyckades för värde vid uppdatering av ett dokument

  4. Hur man projicerar arrayindex efter att ha avvecklat en array med MongoDB-aggregationsramverk