首先,在網頁插入上傳文件的表單。
~~~
Select an image to upload:
~~~
然后,服務器腳本建立指向`/upload`目錄的路由。這時可以安裝multer模塊,它提供了上傳文件的許多功能。
~~~
var express = require('express');
var router = express.Router();
var multer = require('multer');
var uploading = multer({
dest: __dirname + '../public/uploads/',
// 設定限制,每次最多上傳1個文件,文件大小不超過1MB
limits: {fileSize: 1000000, files:1},
})
router.post('/upload', uploading, function(req, res) {
})
module.exports = router
~~~
上面代碼是上傳文件到本地目錄。下面是上傳到Amazon S3的例子。
首先,在S3上面新增CORS配置文件。
~~~
*
GET
POST
PUT
*
~~~
上面的配置允許任意電腦向你的bucket發送HTTP請求。
然后,安裝aws-sdk。
~~~
$ npm install aws-sdk --save
~~~
下面是服務器腳本。
~~~
var express = require('express');
var router = express.Router();
var aws = require('aws-sdk');
router.get('/', function(req, res) {
res.render('index')
})
var AWS_ACCESS_KEY = 'your_AWS_access_key'
var AWS_SECRET_KEY = 'your_AWS_secret_key'
var S3_BUCKET = 'images_upload'
router.get('/sign', function(req, res) {
aws.config.update({accessKeyId: AWS_ACCESS_KEY, secretAccessKey: AWS_SECRET_KEY});
var s3 = new aws.S3()
var options = {
Bucket: S3_BUCKET,
Key: req.query.file_name,
Expires: 60,
ContentType: req.query.file_type,
ACL: 'public-read'
}
s3.getSignedUrl('putObject', options, function(err, data){
if(err) return res.send('Error with S3')
res.json({
signed_request: data,
url: 'https://s3.amazonaws.com/' + S3_BUCKET + '/' + req.query.file_name
})
})
})
module.exports = router
~~~
上面代碼中,用戶訪問`/sign`路徑,正確登錄后,會收到一個JSON對象,里面是S3返回的數據和一個暫時用來接收上傳文件的URL,有效期只有60秒。
瀏覽器代碼如下。
~~~
// HTML代碼為
// Please select an image
//
//
//
document.getElementById("image").onchange = function() {
var file = document.getElementById("image").files[0]
if (!file) return
sign_request(file, function(response) {
upload(file, response.signed_request, response.url, function() {
document.getElementById("preview").src = response.url
})
})
}
function sign_request(file, done) {
var xhr = new XMLHttpRequest()
xhr.open("GET", "/sign?file_name=" + file.name + "&file_type=" + file.type)
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
var response = JSON.parse(xhr.responseText)
done(response)
}
}
xhr.send()
}
function upload(file, signed_request, url, done) {
var xhr = new XMLHttpRequest()
xhr.open("PUT", signed_request)
xhr.setRequestHeader('x-amz-acl', 'public-read')
xhr.onload = function() {
if (xhr.status === 200) {
done()
}
}
xhr.send(file)
}
~~~
上面代碼首先監聽file控件的change事件,一旦有變化,就先向服務器要求一個臨時的上傳URL,然后向該URL上傳文件。
- 1. 概述
- 1.1 搭建HTTPs服務器
- 2. 運行原理
- 2.1 底層:http模塊
- 2.2 對http模塊的再包裝
- 2.3 什么是中間件
- 2.4 use方法
- 3. Express的方法
- 3.1 all方法和HTTP動詞方法
- 3.2 set方法
- 3.3 response對象
- 3.4 requst對象
- 4. 項目開發實例
- 4.1 編寫啟動腳本
- 4.2 配置路由
- 4.3 靜態網頁模板
- 5. 動態網頁模板
- 5.1 安裝模板引擎
- 5.2 新建數據腳本
- 5.3 新建網頁模板
- 5.4 渲染模板
- 5.5 指定靜態文件目錄
- 6. ExpressJS 4.0的Router用法
- 6.1 基本用法
- 6.2 router.route方法
- 6.3 router中間件
- 6.4 對路徑參數的處理
- 7. 上傳文件
- 8. 參考鏈接