一、上传

formidable天生可以处理上传的文件,非常简单就能持久上传的文件。

今天主要讲解的是,前后端的配合套路。

上传分为同步、异步。同步公司使用非常多,异步我们也会讲解。

1.1 先看一下antd中的Form和代码校验

我们看antd中的Form组件,https://ant.design/components/form-cn/

所谓的装饰器指的是将一个组件作为一个函数的参数。

MyForm是一个标准的组件,要用Form.create()()装饰一下。

const WrappedRegistrationForm = Form.create()(MyForm);

装饰器,就是函数后面有两个圈比如,getFieldDecorator()()。第一个圈里写如何装饰,第二个圈里写被装饰的组件。

慢慢去分析人家的API,慢慢看,慢慢琢磨。


1.2 上传前端套路和formidable的实现 

 <input type="file"/>

我们现在要制作提交,前端界面必须满足几点:

1)必须要用form标签嵌套,这是一个表单,不是一个ajax程序;

2)表单的method属性必须是POST

3)必须有enttype,值是“multipart/form-data”,什么意思?下面有图片讲解

4) file控件必须有name属性

5)必须有提交按钮

<form action="/uploadAvatar" method="POST" enctype ="multipart/form-data">
<input type="file" name="avatar" />
<input type="submit" name="上传"/>
</form>

后端实现上传非常简单(当然工作实现上传肯定不是你的事情):

//上传图片的路由
app.post("/uploadAvatar" , function(req,res){
var form = new formidable.IncomingForm();
//定义上传的文件夹名字
form.uploadDir = path.resolve(__dirname , "./www/uploads");
//保留文件拓展名
form.keepExtensions = true; form.parse(req , function(err , fileds , files){
res.send("成功");
});
});

文件名会被随机改名。

如何得到上传之后的随机名字?

form.parse(req , function(err , fileds , files){
console.log(files.avatar.path);
res.send("成功");
});

提炼真正的文件名,而不包括完整路径:

 var base = path.parse(files.avatar.path).base;

1.3 抑制页面跳转

当点击submit按钮的时候,浏览器的默认逻辑就是跳转到action的页面。

除非你用异步。但是,异步Ajax浏览器很少支持,IE10开始支持。

<form action="/uploadAvatar" method="POST" enctype="multipart/form-data">
<input type="file" name="avatar" />
<input type="submit" name="上传"/>
</form>

在同步的时候,我们就要使用奇淫技巧。

使用iframe,框架,内嵌小电视。

<iframe src="http://www.baidu.com" frameborder="1"></iframe>

在小电视中的所有跳转,都是关闭到小电视中的。

我们的表单就可以被内签到小电视中,此时即使submit发生了跳转,也是在小电视中的跳转。

直接使用静态页面,在www里面创建pages文件夹:

一切都将发生在小电视中,页面跳转被抑制了。


1.4 上传按钮

并且我们希望用户选择完图片之后,就能立即上传,而不用多一次提交的点击。

用模拟事件就行了

所有的内嵌页面,将不能天生拥有外部的window的作用域。

alert($)

alert(window.parent.$)

jQuery有问题,只能得到引包的window域中的dom。

模拟事件:

  <script>
$("#pencile").click(function(){
$("#file_btn").trigger("click");
}); //一旦file被改变,就上传
$("#file_btn").bind("change" , function(){
$("form")[0].submit();
});
</script>

1.5 回调函数

上传成功之后调用父window中的js。

form.parse(req , function(err , fileds , files){
var base = path.parse(files.avatar.path).base;
res.send("<script>window.parent.success_upload_avatar(" + base + ");</script >")
});

二、图片的裁切

2.1 gm的安装

我们要安装gm这个东西,它是C++写出来的一个软件,不是npm包。

http://www.graphicsmagick.org/

GraphicsMagick is the swiss army knife of image processing.

小而功能多

下载:ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/windows/

按自己的位数进行安装:

将安装路径,上图所示的这个文件夹的路径,添加到系统的环境变量中

为了检查环境变量是否设置正确,要输入

gm -version


2.2 让gm为nodejs工作

https://www.npmjs.com/package/gm

此时要安装gm这个npm包

npm install --save gm

nodejs就能够剪裁图片、编辑图片、美化图片等等操作。

nodejs程序

var gm = require("gm");
//上传图片的路由
app.post("/uploadAvatar" , function(req,res){
var form = new formidable.IncomingForm();
//定义上传的文件夹名字
form.uploadDir = path.resolve(__dirname , "./www/uploads");
//保留文件拓展名
form.keepExtensions = true; form.parse(req , function(err , fileds , files){
//图片的物理路径,指的是c:\node_study……
var pathwuli = files.avatar.path;
//图片的文件名
var base = path.parse(pathwuli).base; //查看上传的文件的宽度、高度
gm(pathwuli).size(function(err, size){
console.log(size.width , size.height);
res.send("<script>window.parent.success_upload_avatar('" + base + "');</script >")
}); });
});

formidable是用来上传图片的

gm是用来处理图片。这里使用了语法

gm().size(function(err,size){

})

可以得到图片的尺寸。

后台要给你图片尺寸,因为你不能耍无赖:让图片撑出盒子,又让图片被盒子约束。

上传图片,已经是先上传图片,然后在页面上显示具有URL服务器地址的图片。

然后我们要有一个思维,就是用px来精确控制弹出层的样子,这样好看。


2.3 图片的裁切逻辑

新瓶装旧酒,jQuery的DOM逻辑还是非常丰富,React在这里只是一个壳子。

  componentDidMount(){
var self = this;
//四个信号量
var cutX = 0 , cutY = 0, cutW = 100 , cutH = 100; //cut里面的猫腻图片,为了让cut亮
var $cut_img = $(this.refs.cut_img); $(this.refs.cut).draggable({
containment : "parent",
drag : function(event , ui){
cutY = ui.position.top;
cutX = ui.position.left; $cut_img.css({
"left": -cutX,
"top": -cutY
}); //调用设置预览图的函数
setPreviews();
}
}); //改变尺寸
$(this.refs.cut).resizable({
aspectRatio : 1 ,
containment : "parent",
resize : function(evnet , ui){
cutW = ui.size.width;
cutH = ui.size.height; //调用设置预览图的函数
setPreviews();
}
}); //设置预览路
function setPreviews(){
var bigimgW = $(self.refs.bigimg).width();
var bigimgH = $(self.refs.bigimg).height(); //批量设置
$(self.refs.priewBox).find(".pb").each(function(){
var w = $(this).data("w"); $(this).find("img").css({
"width": w * bigimgW / cutW,
"left": -cutX / cutW * w,
"top": -cutY / cutH * w
})
});
} //裁切按钮的事件监听
self.cutBtnHandler = function(){
//图片原宽和当前宽度的比
var rate = self.props.realw / $(self.refs.bigimg).width(); $.post("/docut" , {
x: cutX * rate,
y: cutY * rate,
w: cutW * rate,
h: cutH * rate,
picurl: self.props.tanchucengPicUrl
});
}
}

示例代码

后端接口

app.post("/docut" , function(req,res){
var form = new formidable.IncomingForm();
form.parse(req, function (err, fileds, files) {
//得到前端发来的各种数据
const {x, y,w,h,picurl} = fileds;
//完整路径
var fullurl = path.resolve(__dirname , "./www/" + picurl);
//裁切图片
gm(fullurl)
.crop(w,h,x,y) //注意这里的坑:参数的顺序是宽、高、x、y。
.resize(180,180)
.write(fullurl , function(err){ //覆盖原图即可
console.log(err)
console.log("done");
})
});
})

示例代码


前端笔记之React(八)上传&图片裁切的更多相关文章

  1. 前端(react)上传到阿里云OSS存储 实例

    需求背景 由于现有的后台管理系统,上传的视频越来越大,加上上传视频较慢,后端小哥提出直接从前端上传视频或者其他文件到阿里云OSS存储. 阿里云OSS 阿里云OSS文档介绍,这里不做过多赘述 安装 原本 ...

  2. 前端PHP入门-031-文件上传-六脉神剑

    php.ini的设置 php.ini的文件太多,找不到的时候你可以使用 Ctrl+F 搜索相关配置项. 配置项 功能说明 file_uploads on 为开启文件上传功能,off 为关闭 post_ ...

  3. Django中怎么做图片上传--图片展示

    1.首先是html页面的form表单的三大属性,action是提交到哪,method是提交方式,enctype只要有图片上传就要加这个属性 Django框架自带csrf_token ,所以需要在前端页 ...

  4. spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置

    spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ ...

  5. 2020最新Servlet+form表单实现文件上传(图片)

    servlet实现文件上传接受 这几天学了一点文件上传,有很多不会,在网查了许多博客,但是最新的没有,都比较久了 因为我是小白,版本更新了,以前的方法自己费了好久才弄懂,写个随笔方便以后查找 代码奉上 ...

  6. HTML5——摒弃插件和前端框架的异步文件上传

    之前我从来没有体会到HTML5的便利,直到这次需要一个异步上传的功能功能.一开始我以为文件的一些声明必须为HTML5才管用,后来才知道添加了很多以前没有的标签,并可以直接播放视频,音频等.可以不再使用 ...

  7. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理

    1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户 ...

  9. PHP学习笔记 02 之文件上传

    我们了解了表单传值后,这些我就可以完成PHP的文件上传了.我们了解PHP文件上传前,先了解PHP文件上传的原理. 一.PHP上传文件原理 第一步:将本地的文件通过form表单上传到服务器的临时目录中, ...

随机推荐

  1. 50道SQL练习题及答案与详细分析!!!

    以前在学校还没有很认真地意识到,现在到了企业才发现sql是那么的重要,看到网上有很多的sql 练习题,特地拿来练练手! 数据表介绍 --1.学生表 Student(SId,Sname,Sage,Sse ...

  2. Flink中的状态与容错

    1.概述 Flink支持有状态计算,根据支持得不同状态类型,分别有Keyed State和Operator State.针对状态数据得持久化,Flink提供了Checkpoint机制处理:针对状态数据 ...

  3. 并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque

    LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元 ...

  4. JAVA 实现 GET、POST、PUT、DELETE HTTP请求

    1.get 2.put 3.post 4.delete

  5. Oracle数据库----查询

    --笛卡尔集select empno,ename, 员工表.deptno, 部门表.deptno, dname from 部门表, 员工表; --添加合适的条件,可以避免笛卡尔集,从而得到正确的多表查 ...

  6. c++ 广度优先搜索(宽搜)

    c++ bfs基本应用 Knight Moves 题目描述 贝茜和她的表妹在玩一个简化版的国际象棋.棋盘如图所示: 贝茜和表妹各有一颗棋子.棋子每次移一步,且棋子只能往如图所示的八个方向移动.比赛的规 ...

  7. 堡垒机-jumpserver

    目录 官方网站 Jumpserver 软件包环境要求: 环境 手动本地jumpserver-服务端搭建 初始化一些系统环境设置: 安装相关软件 安装 组件 自建服务器极速安装步骤 0. 防火墙.Sel ...

  8. 串门赛: NOIP2016模拟赛——By Marvolo 丢脸记

    前几天liu_runda来机房颓废,顺便扔给我们一个网址,说这上面有模拟赛,让我们感兴趣的去打一打.一开始还是没打算去看一下的,但是听std说好多人都打,想了一下,还是打一打吧,打着玩,然后就丢脸了. ...

  9. Redis主从复制实现原理

    一.Redis2.8之前的版本, 首先redis复制功能分为同步操作和命令传播两个操作 同步操作作于将从服务器的数据库状态更新至主服务器当前所处的数据库状态  命令传播操作则用于在主服务器的数据库状态 ...

  10. ASP.NET Core MVC 之视图(Views)

    ASP.NET Core MVC 控制器可以使用视图返回格式化的结果. 1.什么是视图 在 MVC 中,视图封装了用户与应用交互呈现细节.视图是具有生成要发送到客户端内容的,包含嵌入代码的HTML模板 ...