两种方式上传图片文件到服务器(包含前后端代码)

上传图片文件到服务器

  • 前言:
  • 一、使用 form 表单
  • 二、使用 input 监听 change 事件

前言:

在 Web 应用中,上传图片功能很常见,今天就给大家分享两种上传图片到服务器的方法,包含前后端代码(后台用 Node)。
本文使用的环境为:

  • express 版本为 4.17.1
  • fs 版本为 7.0.1
  • path 版本为 0.1.7
  • multer 版本为 1.4.1
  • uuid 版本为 3.3.2
  • formidable 版本为 1.2.1

一、使用 form 表单

1. 前端代码

<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>文件上传表单title>
head>
<body>
<h3>文件上传:h3>
选择一个文件上传: <br />
<form action="/file_upload" method="post" enctype="multipart/form-data">
    <input type="file" name="image" size="50" />
    <br />
    <button type="submit">上传button>
form>
body>
html>

注意点:

  • 请求方式为 post
  • 需要设置 form 表单的 enctype 属性为 “multipart/form-data”

2. 后端代码

var express = require('express');
var app = express();
var fs = require("fs");
var multer  = require('multer');
app.use('/public',express.static('public'));
app.use(multer({ dest: '/tmp/'}).array('image'));
app.post('/file_upload',function (req, res) {
    fs.readFile( req.files[0].path, function (err, data) {
        var des_file = __dirname + "/public/img/" + req.files[0].originalname;
        fs.writeFile(des_file, data, function (err) {
            if(err){
                console.log( err );
            }else{
               var response = {
                    message:'文件上传成功',
                    filename:req.files[0].originalname
                };
            }
            res.send( JSON.stringify( response ) );
        });
    });
})
var server = app.listen(8081, function () {
    var host = server.address().address;
    var port = server.address().port;
    console.log("应用实例,访问地址为 http://", host, port)
})

注意点:

  • 除了常规的 express 模块和 fs 模块,还需要用到 multer 模块

二、使用 input 监听 change 事件

1. 前端代码

<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>文件上传表单title>
head>
<body>
<h3>文件上传:h3>
选择一个文件上传: <br />
<input id="file" type="file" name="image" size="50" />

body>
<script src="jquery.min.js">script>
<script>
    $('#file').change(function(){
        var input = $('#file')[0];
        //图片上传成功后会将图片名称赋值给 value 属性
        if(input.value){
            //使用 FormData 对象
            var formData = new FormData();
            //将图片对象添加到 files
            formData.append('files', $('#file')[0].files[0])
            //使用 ajax 上传图片
            $.ajax({
                url: 'http://localhost:8081/file_upload',
                type: 'POST',
                cache: false,
                data: formData,
                processData: false,
                contentType: false
            }).done(function(res) {
                console.log(res);
            }).fail(function(res) {
                console.log(res);
            });
            //以下是将图片显示到 img 标签上
//            var pic = input.files[0];
//            var read = new FileReader();
//            read.onload = function (e) {
//               document.getElementById('img').src = e.target.result;
//            };
//            read.readAsDataURL(pic);
        }
    })
script>
html>

注意点:

  • 需要使用 FormData 对象
  • processData 和 contentType 均为 false

2. 后端代码

var express = require('express');
var app = express();
var fs = require("fs");
var path = require('path');
var uuid = require('uuid');
var formidable = require('formidable');
app.use('/public',express.static('public'));
app.post('/file_upload',function (req, res) {
    //创建表单
    var form = new formidable.IncomingForm();
    //设置编码格式
    form.encoding = 'utf-8';
    //设置文件存储路径
    form.uploadDir = "public/img";
    //保留后缀
    form.keepExtensions = true;
    //设置单文件大小限制 2m
    form.maxFieldsSize = 2 * 1024 * 1024;
    //form.maxFields = 1000;  设置所以文件的大小总和
    form.parse(req, function (err, fields, files) {
        var file = files.files;
        let picName = uuid.v1() + path.extname(file.name);
        fs.rename(file.path, 'public\\img\\' + picName, function (err) {
            if (err) return res.send({ "error": 403, "message": "图片保存异常!" });
            res.send({ "picAddr": picName });
        });
    });
})
var server = app.listen(8081, function () {
    var host = server.address().address;
    var port = server.address().port;
    console.log("应用实例,访问地址为 http://", host, port)
})

注意点:

  • 除了常规的 express 模块、fs 模块 和 path 模块,还需要用到 uuid 模块与 formidable 模块

你可能感兴趣的:(Node)