好久没有更新博客了,这几天在写文件上传的时候遇到了一个新的问题,就是关于ajax实现文件上传的问题

这几天在做一个小的demo,类似于论坛的一个东西,基于jquery+express+mongo的一个小的案例,在做到关于设置个人头像的时候,有这样一个场景,用户可以上传头像,然后上传头像成功后,可以对原图进行剪裁,最后的到剪裁后的图像,更改成用户头像。

其实,这个技术上有很多种解决方案,我的问题不是在于实现这个功能的问题上,功能很好实现关键在于用户体验,功能实现的话,图省事,我可以直接用form表单将用户上传的头像提交到后台,后台先存储图片,然后跳转到例外一个页面,将用户上传的图片进行剪裁,这样做很简单,但是这里有个明显的弊端,就是重新刷新了页面,跳转到另外一个页面了,这样用户体验会很不好,所以我就想能不能异步提交表单。

别说,还真有可以异步提交表单的方法,我之前也听说过,但是一直没有用过,在这里,针对这个场景,两种解决的方法,第一个是formData,第二个是ajaxForm插件,我引用的是第一个解决方法,用formData对象来解决异步提交表单的问题,formData是h5中新增的一个js的对象,兼容主流浏览器(别跟我说IE678,),如果考虑低版本浏览器的话,那么还是考虑表单直接提交吧(体验什么就不要考虑了),或者可以用下ajaxForm(基于jquery插件)。

别说了,说的太累了,直接上代码吧

前台html代码(基于bootstrap的)

File input

上传

上传成功

前台js

$('#upfile_btn').click(function(event) {

var formData = new FormData();

formData.append('file', $('#file')[0].files[0]);

$.ajax({

url: '/upavatar',

type: 'POST',

cache: false,

data: formData,

processData: false,

contentType: false

}).done(function(data) {

if (data.status == '1') {

//成功

$('#cg').fadeIn().fadeOut(4000, function() {

var htmlStr = '建材';

$('.jiancaidiv').append(htmlStr);

$('#element_id').Jcrop();

$('#jiancai').click(function(event) {

// alert(111)

/* Act on the event */

var width = parseInt($(".jcrop-holder div:first").css('width'));

var height = parseInt($(".jcrop-holder div:first").css('height'));

var left = parseInt($(".jcrop-holder div:first").css('left'));

var top = parseInt($(".jcrop-holder div:first").css('top'));

console.log(width + ' ' + ' ' + height + ' ' + left + ' ' + top);

$.ajax({

url: '/docut',

type: 'POST',

dataType: 'json',

data: {

width: width,

height: height,

left: left,

top: top,

},

})

.done(function(data) {

if (data.status == '1') {

alert('修改头像成功');

location.href = '/'

}

})

.fail(function() {

console.log("error");

})

.always(function() {

console.log("complete");

});

});

});

} else {

//失败

}

console.log('success');

}).fail(function(res) {});

});

后台node(js代码)

var express = require('./node_modules/express');

var bodyParser = require('body-parser');

var router = require('./route.js');

var session = require('express-session');

var formidable = require("formidable");

var fs = require('fs');

var gm = require('./node_modules/gm')

var db = require('./models/db.js');

// create application/x-www-form-urlencoded parser

var urlencodedParser = bodyParser.urlencoded({

extended: false

});

var app = express();

//使用session

app.use(session({

secret: 'keyboard cat',

resave: false,

saveUninitialized: true

}));

//创建静态服务

app.use(express.static('./public'));

//上传头像部分

app.post('/upavatar', function(req, res) {

var form = new formidable.IncomingForm();

form.uploadDir = "./avatar";

form.parse(req, function(err, fields, files) {

console.log(files);

var oldPath = './' + files.file.path;

var newPath = './avatar/' + req.session.userName + '.jpg';

fs.rename(oldPath, newPath, function(err) {

if (err) {

//上传失败

var json = {

'status': '0'

};

res.send(json);

} else {

//成功

var json = {

'status': '1',

'userName': req.session.userName

};

res.send(json);

}

})

});

})

app.post('/docut', urlencodedParser, function(req, res) {

console.log(req.body);

var width = req.body.width;

var height = req.body.height;

var left = req.body.left;

var top = req.body.top;

gm("./avatar/" + req.session.userName+'.jpg')

.crop(width, height, left, top)

.write("./avatar/" + req.session.userName+'.jpg', function(err) {

if (err) {

var json = {'status':'-1'};

res.send(json);

return;

}

var json = {'status':'1'};

res.send(json);

});

})

这里前台将图片上传后,前台首先将文件对象放到formData对象中,然后以ajax的方式提交后台,后台通过formidable接受到文件,将图片保存到avatar文件夹下并且改名,之后前台在当前以页面显示图片,给用户剪裁,剪裁好后,将剪裁的参数提交到后台,后台根据参数用gm剪裁,保存更改

java ajax 更改头像_ajax+node实现头像更改相关推荐

  1. java ajax 点赞功能_Ajax+jQuery+bootstrap+Java实现异步点赞功能,并限制点击次数

    在很多的网站上有很多不同的点赞,我不知道他们是怎么实现的,下面我来分享一下我写的点赞实现,共大家参考下, 这是我在一个项目抽取的代码,可能有些样式会发生变化,但是功能不会影响. 网页代码: 这个是根据 ...

  2. java ajax 登陆验证_AJAX+JAVA用户登陆注册验证

    需求 通过ajax异步刷新页面验证用户输入的账号密码是否在数据库中存在. 技术栈 JSP+Servlet+Oracle 具体代码 JSP部分: pageEncoding="UTF-8&quo ...

  3. java ajax轮询_ajax轮询(ajax轮询实现聊天)

    最近一直在研究ajax长轮询连实现即时通信,但是到底是个怎么轮询法?难道. 一般最原始的作法就是在客户端搞个定时器一直向后台请求,而ajax的长轮询与一般的http连接不一样,它发送的是长连接,比如说 ...

  4. java ajax轮询_ajax轮询

    http://blog.csdn.net/qq_23412263/article/details/70260057 原理 普通的jquery ajax轮询的原理主要是,客户端通过定时器定时发送ajax ...

  5. java ajax 定时刷新_Ajax实现定时刷新页面

    XML Schema命名空间解析 URI Web中汇集了各种资源.资源可以是具有标识的任何事物, 如文档. 文件. 菜单项. 计算机. 服务等, 甚至可以包括人. 组织和概念[BernersLee ...

  6. java cropper 上传_java web 网站头像上传处理 (springmvc +bootstrap+cropper)

    制作头像上传.请根据您的实际需求,修改代码,不完全正确,仅供参考! 前端页面设计使用bootstrap ,头像预览和剪裁工具使用cropper 后台使用springmvc. 现在来看前端的页面设计 前 ...

  7. java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格

    java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格 效果图,这里只放了几张,1-9张图片都可以的,如果图片路径是从数据库查出来的相对路径,记得加上绝对路径否则会报找不到读取文件 ...

  8. java+ajax实现文件上传

    1 文件上传 利用Java+ajax实现文件上传,这里介绍两种提交方法,第一种是file提交,第二种是base64提交 1.1 file方式 1.1.1 FileNameUtils public cl ...

  9. ajax json的参数,java ajax json参数

    java ajax json参数 [2021-02-02 08:55:23]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&quo ...

最新文章

  1. django之全文检索
  2. 最强去马赛克AI来了,分分钟回到无马世界,连像素风《我的世界》人物都能复原...
  3. NanoPi NEO Air使用七:获取并编译U-boot和Linux的源码
  4. php正则表达式匹配img中任意属性的方法
  5. PE文件格式--------------导出表
  6. 解耦,未解耦的区别_幂等与时间解耦之旅
  7. 南昌地铁信息化服务器,南昌地铁传来大消息!太方便了!
  8. GitHub简单教程
  9. matlab官方中文网站
  10. coreos(coreos介绍)
  11. sed替换指定字符串为某变量的值
  12. Unity Shader - 车漆效果(基于MatCap)
  13. 面对众多的选择,我选择什么
  14. 寻路 pathfinder 狂乱画
  15. 第一遍Java学习笔记
  16. VS集成Qt环境搭建
  17. 算法与数据结构实验题 7.4 玩游戏的亚索 (最小支撑树)
  18. multisim元件库介绍
  19. 微信第三方平台授权(第三方)
  20. [原创] 树莓派使用多个联通4G上网卡

热门文章

  1. 沟通技巧系列 - 积极和移情倾听
  2. 关于Linux开源项目基础组件make编译流程
  3. UTC/GMT 时间转换
  4. 由浅至深 谈谈.NET混淆原理 (四) -- 反混淆(原理 + 工具篇)
  5. Android 帧动画 xml 方式实现
  6. Flutter透明度渐变动画Opacity实现透明度渐变动画效果
  7. Ta Muid(Dreams 梦幻)
  8. FLL - C++与VFP 双向混合编程
  9. JPA ---- 表之间的映射关系
  10. Linux下安装Beego:go install: cannot install cross-compiled binaries when GOBIN is set