Upload plików większych niż 500 megabajtów

0

Czesć,

Robię dedykowany uploader dla jednej aplikacji. Korzystam z Node.js, express, i biblioteki Multer do uploadowania plików. Kod działa dla małych plików ale nie moge sobie poradzić z wysyłaniem plików większych np. 500 MB. Znalazłem już na forach sugestie czasu wydłużania połączenia ale to nie pomaga, wciąż mam błąd:

net::ERR_CONNECTION_RESET

plik serwera uploader.js:

const express = require('express');
const multer = require('multer')
const fs = require('fs')
const app = express();
const bodyParser = require('body-parser')
const {
  engine
} = require('express-handlebars')
const db = require('./db')

app.engine('handlebars', engine({
  defaultLayout: 'main',
}))
app.set('view engine', 'handlebars')

app.use(express.static(__dirname + '/public'))
const jsonParser = bodyParser.json()

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    const id = req.body.order
    const path = `D:/JS/test/${id}`
    fs.mkdirSync(path, { recursive: true })
    cb(null, path)
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname)
  }
})
const upload = multer({ 
  storage: storage,
  limits: {
    fileSize: 2 * 1024 * 1024 * 1024
  } 
})
app.post('/upload', jsonParser, upload.array('files'),  function (req, res, next) {
  req.socket.setTimeout(10 * 60 * 1000)
  console.log(req.files)
  console.log(req.body) 
  })

function startServer() {
  const port = 3000;
  server = app.listen(port, function () {
      console.log('Node version:' + process.versions.node);
      console.log('Express server listening on port %d in %s mode', port, app.settings.env);
  });
  server.on('connection', function(socket) {
    // 10 minutes timeout
    socket.setTimeout(10 * 60 * 1000);
});
  const timeoutValue = 10*60*1000
  server.headersTimeout = timeoutValue
}
startServer()
  

formularz html:

<form method="post" id="uploadFiles" enctype="multipart/form-data">
  <input type="hidden" id="order" name="order" />
  <input type="file" name="files" multiple="multiple" />
  <input type="button" onclick="uplFiles()" value="Upload" />
</form>
<script type="application/javascript" src="http://127.0.0.1:3000/javascript/start.js"></script>

plik start.js:

let fullId = document.querySelector("#order-id").attributes.value.nodeValue
document.getElementById("order").value = fullId

function uplFiles() {
  fetch('/upload', {
    method: 'POST',
    body: formData
  })
  .then(res => res.json())
  .then(object => {
    console.log(object)
  })
}

znalazłem taką funkcje która dodatkowa ma wydłużać czas oczekiwania na na response ale tez nie działa:

function uplFiles() {
  const form = document.getElementById("uploadFiles");
  const formData = new FormData(form);
  function timeout(ms, promise) {
    return new Promise(function (resolve, reject) {
      setTimeout(function () {
        reject(new Error("timeout"))
      }, ms)
      promise.then(resolve, reject)
    })
  }

  timeout(10 * 60 * 1000,
    fetch('/upload', {
      method: 'POST',
      body: formData
    })
      .then(function (response) {
        console.log(response)
        // process response
      })
      .catch(function (error) {
        console.log(error)
        // might be a timeout error
      })
  )
}

Ma ktoś może pomysł jak sobie z tym poradzić? trafiłem na ścianę :(

0

poszukaj czy gdzieś nie ma ustawień limitu wielkości danych. Zazwyczaj każdy serwer www ma ustawiony pewien limit.

0
ehhhhh napisał(a):

poszukaj czy gdzieś nie ma ustawień limitu wielkości danych. Zazwyczaj każdy serwer www ma ustawiony pewien limit.

Na razie uploader działa lokalnie, ustawienia serwera node.js są powyżej

1

Wysyłaj partiami. Podziel plik po stronie JavaScript na mniejsze kawałki i wysyłaj partiami.
W ten sposób uzyskasz narzędzie dla którego jedynym ograniczeniem będzie pojemność dysku serwera.

0

Takie duże pliki to najlepiej jest przesyłać przez rsync po SSH.

0
katakrowa napisał(a):

Wysyłaj partiami. Podziel plik po stronie JavaScript na mniejsze kawałki i wysyłaj partiami.
W ten sposób uzyskasz narzędzie dla którego jedynym ograniczeniem będzie pojemność dysku serwera.

Ciekawy pomysł....przyjrzę się jakie są możliwości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1