Tải lên video nodejs express

Xin chào các bạn. hôm nay mình sẽ hướng dẫn các bạn viết một Node. js server đơn giản để tải ảnh lên, sau đó chúng ta sẽ viết một Ứng dụng Android để tải ảnh lên

Mã có sẵn tại. https. //github. com/hoc081098/Upload-Image-Node. js

Video direction at. https. //www. youtube. com/watch?v=pL5Ci_lfxlw&t=3s

1. Điều kiện tiên quyết
  • Cài đặt môi trường nút. js và npm trong hệ điều hành của bạn (Windows, Linux hoặc OS X). Load down Node. js từ liên kết. https. //nodejs. tổ chức
  • Tải xuống và cài đặt máy chủ MongoDB trong hệ điều hành của bạn (Windows, Linux hoặc OS X) từ liên kết. https. //www. mongodb. com/trung tâm tải xuống
  • Tải xuống và cài đặt Robomongo, một ứng dụng khách GUI được sử dụng để tạo và xem cơ sở dữ liệu, tải xuống từ liên kết. https. //robomongo. tổ chức/
2. Tạo cơ sở dữ liệu MongoDB

Sử dụng Robomongo để tạo nền tảng MongoDB mới có tên là upload-image. Sau đó nhấp chuột phải vào cơ sở dữ liệu đã tạo và chọn Open Shell. Gõ đoạn mã sau vào shell

db.getCollection('imagemodel').createIndex ({ "name": 1 }, { unique: true })

Đoạn mã trên làm cho tên trường là duy nhất, tương tự như từ khóa chính trong cơ sở dữ liệu quan hệ như MySQL

3. Tạo dự án

Tạo 1 thư mục tên NodeUploadImage. Use terminal (hoặc Command Prompt trong hệ điều hành Windows), cd to the new directory.
______1
Sau đó cài đặt các phụ thuộc.
______2
Trong đó.

  • bày tỏ. Đây là một khung hoàn chỉnh được sử dụng để tạo ra các dịch vụ web RESTful
  • cầy mangut. Mô-đun này được sử dụng để kết nối với cơ sở dữ liệu MongoDB
  • cơ quan. Mô-đun này được sử dụng để đăng nhập vào thiết bị đầu cuối theo yêu cầu http
  • lẩm bẩm. Mô-đun này là cầu nối trung gian được sử dụng để tải lên tệp dễ dàng
  • loại tệp. Mô-đun này được sử dụng để lấy loại MIME của tệp được lưu trữ
4. Cấu trúc của dự án

Chúng ta có 2 tệp

  • image_model. js. where we định nghĩa MongoDB Collection shema
  • mục lục. js. bộ định tuyến và chạy ứng dụng
5. Tệp image_model. js

Chúng ta định nghĩa lược đồ imageModel có 3 trường

  • Tên. type String, save name image, duy nhất
  • image_path. type String, save path of image
  • created_at. type Date, default value is Date. bây giờ, lưu thời gian tạo mô hình

hoàn chỉnh mã

Tệp này chứa văn bản Unicode hai chiều có thể được diễn giải hoặc biên dịch khác với nội dung hiển thị bên dưới. Để xem lại, hãy mở tệp trong trình chỉnh sửa hiển thị các ký tự Unicode bị ẩn. Tìm hiểu thêm về các ký tự Unicode hai chiều

Hiển thị ký tự ẩn

const mongoose = yêu cầu('mongoose')mongoose.Lời hứa = toàn cầu. Lời hứaconst lược đồ = new . mongoose.Lược đồ({tên . Chuỗi,đường dẫn_hình ảnh . Chuỗi,created_at . {loại . Ngày,mặc định . Ngày. bây giờ}})const . //máy chủ cục bộ. 27017/upload-image' mongoDb = 'mongodb://localhost:27017/upload-image'mongoose. kết nối(mongoDb)mô-đun . .xuất khẩu = cầy mangut. mô hình('mô hình hình ảnh', schema)

xem raw được lưu trữ với ❤ ​​bởi GitHub

6. chỉ mục tệp. js

hoàn chỉnh mã

Tệp này chứa văn bản Unicode hai chiều có thể được diễn giải hoặc biên dịch khác với nội dung hiển thị bên dưới. Để xem lại, hãy mở tệp trong trình chỉnh sửa hiển thị các ký tự Unicode bị ẩn. Tìm hiểu thêm về các ký tự Unicode hai chiều

Hiển thị ký tự ẩn

const express = require('express')const app = express()const router = express.Bộ định tuyến()const đường dẫn . /image_model' = require('path')const fileType = require('file-type')const multer = require('multer')const fs = require('fs')const imagemodel = require('./image_model')ứng dụng. sử dụng(yêu cầu(' . //máy chủ cục bộ. 27017/upload-image)('combined'))//mongodb://localhost:27017/upload-imageconst upload = multer({dest: 'hình ảnh/',bộ lọc tệp . (yêu cầu, tệp, . callback) => {if (!/\S+\. ( jpg . bmp . gif . png )/ gi. thử nghiệm(tệp. tên gốc)) {return . callback(Error('Invalid image file name'), false)}const reqName = req.tham số. image_nameimagemodel. tìm({ tên . reqName }). giới hạn(1). exec((err, . res) => {if (err) {console.log(err)return . callback(err, false)}if (res.độ dài === 0) callback(null, true)else callback(Error(`Image with name: "${reqName} " tồn tại`), false)})}}).đơn('hình ảnh')router.bài đăng('/images/upload/. image_name', (req, res) => {console.log(`Đăng. req = ${req} `)upload(req, res, (err) => {if (err) {res.trạng thái(400). json({ thông báo . err. thông báo })trả về} . const reqName = req.tham số. image_nameconst imagePath = path . .tham gia('hình ảnh', req.tệp. tên tệp)const mô hình = . new imagemodel({name: reqName,image_path . đường dẫn hình ảnh,created_at . mới Ngày()} . )model.lưu((err) . => {if (err) {console.log(err)return . res.trạng thái(500). json({thông báo . err. thông báo})}res . .trạng thái(200). json({ thông báo . `Hình ảnh đã tải lên " ${reqName}" successfully` })})})})router.lấy('/images/. image_name', (req, res) => {console.log(`Nhận. req = ${req} `)imagemodel.tìm({tên . yêu cầu. tham số. image_name}, {image_path . : 1, _id . 0}). giới hạn(1). exec((err, . docs) => {if (err) {console.log(err)return . res.trạng thái(500). json({thông báo . err. thông báo})}nếu . (docs.độ dài === 0) < . return res.trạng thái(404). json({ thông báo . 'Không có tệp hình ảnh như vậy' })}const imagePath = path.tham gia(__dirname, tài liệu . [0].image_path)thử {const . buffer = fs.readFileSync(imagePath)const . mime = fileType(buffer).kịch bảnres. writeHead(200, { . 'Content-Type': kịch bản })res. kết thúc(bộ đệm, ' . )} catch (error) {console.log(lỗi. )nếu (lỗi . . === 'ENOENT') {res.trạng thái(404). json({ thông báo . 'Không có tệp hình ảnh nào như vậy' })} else {res.trạng thái(500). json({ thông báo . lỗi. thông báo })}} . })})router.lấy('/hình ảnh', (req, res) => {console.log(`Nhận. req = ${req} `)const start = parseInt(req.truy vấn. bắt đầu) . 0const limit = parseInt . (req.truy vấn. giới hạn) . 20mô hình hình ảnh. tìm({}, . { name: 1, _id . 0 }). sắp xếp({ created_at . -1 }). bỏ qua(bắt đầu). giới hạn(giới hạn). exec((err, . docs) => {if (err) {console.log(err)return . res.trạng thái(500). json({thông báo . err. thông báo, dữ liệu . null})}res . .trạng thái(200). json({thông báo . 'Nhận dữ liệu thành công',dữ liệu . tài liệu. bản đồ(e => . .tên)})} . )})router.bài đăng("/test", (req, res) => {res.trạng thái(200). gửi("Rất vui")})app.sử dụng('/', router)app.nghe(3001, ( . ) => {console.log('Máy chủ đang chạy ở cổng 3001')})

xem raw được lưu trữ với ❤ ​​bởi GitHub

Chúng ta định nghĩa các điểm cuối

  • ĐĂNG /hình ảnh/tải lên/. Tên Hình ảnh. upload image with image_name
  • NHẬN /hình ảnh/. Tên Hình ảnh. get image with image_name
  • NHẬN /images?start=…&limit=…. get array name image, with start (default 20), limit(default 20)

6. 1. ĐĂNG /hình ảnh/tải lên/. Tên Hình ảnh

Ta sử dụng bộ lọc để tạo chức năng tải lên. with thư mục lưu ảnh là đích. ‘images/’, fileFilter để lọc những tập tin hợp lệ