Code files
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "uploading-a-file-with-put",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "node server.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "David Mark Clements",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"pump": "^1.0.1",
|
||||
"through2": "^2.0.3"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<form id="upload">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
<pre id="status"></pre>
|
||||
<script>
|
||||
(function () {
|
||||
var fieldName = 'userfile1'
|
||||
var field = document.querySelector('[name=' + fieldName + ']')
|
||||
var uploadForm = document.getElementById('upload')
|
||||
var status = document.getElementById('status')
|
||||
var file
|
||||
field.addEventListener('change', function () {
|
||||
file = this.files[0]
|
||||
})
|
||||
uploadForm.addEventListener('submit', function (e) {
|
||||
e.preventDefault()
|
||||
if (!file) return
|
||||
var xhr = new XMLHttpRequest()
|
||||
xhr.file = file
|
||||
xhr.open('put', window.location, true)
|
||||
xhr.setRequestHeader("x-field", fieldName)
|
||||
xhr.setRequestHeader("x-filename", file.fileName || file.name)
|
||||
xhr.onload = updateStatus
|
||||
xhr.send(file)
|
||||
file = ''
|
||||
uploadForm.reset()
|
||||
})
|
||||
function updateStatus() {
|
||||
status.innerHTML += this.status === 200
|
||||
? this.response
|
||||
: this.status + ': ' + this.response
|
||||
}
|
||||
}())
|
||||
</script>
|
||||
@@ -0,0 +1,64 @@
|
||||
'use strict'
|
||||
|
||||
const http = require('http')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const pump = require('pump')
|
||||
const through = require('through2')
|
||||
const form = fs.readFileSync('public/form.html')
|
||||
const maxFileSize = 51200
|
||||
|
||||
http.createServer((req, res) => {
|
||||
if (req.method === 'GET') {
|
||||
get(res)
|
||||
return
|
||||
}
|
||||
if (req.method === 'PUT') {
|
||||
put(req, res)
|
||||
return
|
||||
}
|
||||
reject(405, 'Method Not Allowed', res)
|
||||
}).listen(8080)
|
||||
|
||||
function get (res) {
|
||||
res.writeHead(200, {'Content-Type': 'text/html'})
|
||||
res.end(form)
|
||||
}
|
||||
|
||||
function reject (code, msg, res) {
|
||||
res.statusCode = code
|
||||
res.end(msg)
|
||||
}
|
||||
|
||||
function put (req, res) {
|
||||
const size = parseInt(req.headers['content-length'], 10)
|
||||
if (isNaN(size)) {
|
||||
reject(400, 'Bad Request', res)
|
||||
return
|
||||
}
|
||||
if (size > maxFileSize) {
|
||||
reject(413, 'Too Large', res)
|
||||
return
|
||||
}
|
||||
|
||||
const name = req.headers['x-filename']
|
||||
const field = req.headers['x-field']
|
||||
const filename = `${field}-${Date.now()}-${name}`
|
||||
const dest = fs.createWriteStream(path.join(__dirname, 'uploads', filename))
|
||||
const counter = through(function (chunk, enc, cb) {
|
||||
this.bytes += chunk.length
|
||||
if (this.bytes > maxFileSize) {
|
||||
cb(Error('size'))
|
||||
return
|
||||
}
|
||||
cb(null, chunk)
|
||||
})
|
||||
counter.bytes = 0
|
||||
counter.on('error', (err) => {
|
||||
if (err.message === 'size') reject(413, 'Too Large', res)
|
||||
})
|
||||
pump(req, counter, dest, (err) => {
|
||||
if (err) return reject(500, `Error saving ${name}!\n`, res)
|
||||
res.end(`${name} successfully saved!\n`)
|
||||
})
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<form method="POST" enctype="multipart/form-data">
|
||||
<input type="file" name="userfile1"><br>
|
||||
<input type="file" name="userfile2"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
Reference in New Issue
Block a user