HTML5 FileAPI与Node.js实现图片上传及预览

作者:慢半拍

时间:2026-10-21

浏览:473

本文介绍如何利用HTML5 FileAPI实现前端图片预览,并通过FormData与Node.js后端对接完成上传。详细讲解了FileReader读取文件、base64编码预览以及使用formidable库处理服务端文件保存的具体步骤与代码示例。

文章目录

HTML5 FileAPI实现图片预览

HTML5提供了FileAPI接口。

借助HTML5的FileAPI,处理图片上传的操作变得更加简便。

具体实现案例如下。

HTML结构代码示例。


<div class="form-group">
  <label for="modal_inputFile" class="col-md-3 control-label label-font">位置图:</label>
  <div class="col-md-9">
   <input type="text" readonly="" class="form-control" placeholder="点击选择文件">
   <input type="file" id="modal_inputFile">
   <img src="" class="img-responsive" id="modal-pre" alt="预览区" style="max-height: 300px">
  </div>
</div>

运行效果展示。

HTML5 FileAPI实现图片预览

通过代码$('#modal_inputFile')[0].files[0]可以获取所选图片的文件信息对象。

HTML5 FileAPI实现图片预览

该对象包含name、size和type等常用属性,便于后续处理。

接下来实现图片的本地预览功能。

用户选择图片后,通常希望立即看到预览效果,HTML5对此提供了支持。

HTML5引入了FileReader这一新对象。

FileReader接口的主要功能是将文件读取到内存中,并获取文件数据。

利用该接口读取的数据,可以通过data URL的方式实现图片预览。


var file = document.getElementById(modal_inputFile'').files[0];
 if (!file) {
 return false;
 }
 var reader = new FileReader();
 reader.readAsDataURL(file);
 reader.onload = function(e) {
 var ib_pre = document.getElementById('modal-pre');
 ib_pre.src = this.result;
}

至此,前端图片预览功能已实现。

HTML5 FileAPI实现图片预览

进一步检查img标签的src属性值。


<img src="data:image/png;base64,iVBORXXXXXXXXXXXXX....XXXXXXX" class="img-responsive" id="modal-pre" alt="预览区" style="max-height: 300px">

可以看到src的值是经过base64编码的字符串。

Node.js后端处理图片上传

接下来探讨如何与后端服务器进行数据交互。

既然前端通过文件API已满足展示需求,下一步便是将数据上传至服务端,Node.js是理想的选择。

前端发起网络请求的部分。

以下是前端发送上传请求的代码示例。


//图片上传
$('#preUpload').on('click', function(e) {
 var data = new FormData();
 var _files = $("#modal_inputFile")[0].files[0];
 var ect = ($("#modal_inputFile")[0].files[0]).name.split('.')[1];
 if(ect !== 'png'){
  alert('请上传png图片!')
  return;
 }
 data.append("modal_file", _files);
 $.ajax({
  type: 'post',
  dataType: 'json',
  url: window.stnt_hosts + 'thirdAdmanage/upload/modal',
  data: data,
  contentType: false,
  processData: false
 }).done(function(data, status) {
  console.log('上传成功');
 }).fail(function(err) {
  console.log('上传失败');
 })
})

使用FormData对象来封装需要上传的文件数据。

这里的data变量是一个经过序列化的对象,后端接收处理即可。

后端接收与处理逻辑。

服务端采用node-formidable库来处理图片的保存等操作。

相关后端代码示例。


var formidable = require("formidable");
var form = new formidable.IncomingForm();
//临时目录
form.uploadDir = './upload/';
//预览图片上传
router.post('/upload/modal', function(req, res, next) {
 form.parse(req, function(err, fields, files) {
  if (files.modal_file) {
   rename(files.modal_file.path, files.modal_file.name, 'preview')
   res.send({
    stats:'success',
    data:[]
   })
  }
 })
});
function rename(old, _new, code, bId) {
 var path = './upload/' + code + '/';
  fs.exists(path, function(exists) {
   if (!exists) {
    fs.mkdir(path)
    console.log('创建文件夹!')
   }
   fs.renameSync(old, path + _new, function(err) {
    if (err) {
     console.log(err);
     return;
    }
    console.log('上传成功!')
   })
  })
}

使用fs.renameSync的原因在于,配置中的临时目录form.uploadDir存储的是内存中的临时数据,并非最终图片文件。

处理过程类似如下逻辑。

HTML5 FileAPI实现图片预览

需要调用fs相关方法,将文件重新保存至指定路径,此时文件即为完整的图片。

总结与注意事项。

在form.parse(req, function(err, fields, files)回调中,fields和files具体是什么对象,建议通过浏览器调试工具自行查看,理解后会更加清晰。

此前若不明确,直接通过浏览器搜索往往难以找到准确答案,结果可能不尽如人意。

因此遇到不确定的情况,务必查阅GitHub官方文档或源码。

此外,app.use(bodyParser.urlencoded({ extended: true }));的作用是解析常规form表单提交的数据,即请求头包含Content-Type: application/x-www-form-urlencoded的情况。

而app.use(bodyParser.json())用于解析JSON格式的数据。

以上内容为本文的全部介绍,希望对读者在学习或工作中有所帮助,欢迎支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章