react实现上传文件进度条功能_React.js 可拖放文件的上传表单(支持多文件和进度显示)...

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

console.clear();

const {

createClass,

PropTypes

} = React;

const {

render

} = ReactDOM;

const styles = {

inputWrapper: 'input-wrapper',

inputCover: 'input-cover',

helpText: 'help-text',

fileName: 'file-name',

fileNameStretch: 'file-name spacer',

fileExt: 'file-ext',

fileDrag: 'file-drag',

input: 'input',

loader: 'loader',

disabled: 'disabled',

loading: 'loading',

loaderItem: 'loader-item',

spacer: 'spacer',

button: 'button',

hover: 'hover',

imagePreview: 'image-preview',

preview: 'preview',

previewItem: 'preview-item',

previews: 'previews'

};

const uploadFileToServer = (file) => {

const delay = file.size/100;

return new Promise((resolve,reject)=> {

setTimeout(()=>{

resolve();

}, delay);

});

};

const getExtFromType = (type) => {

const parts = type.split('/');

return parts[parts.length - 1];

};

const getExtFromName = (name) => {

const parts = name.split('.');

return parts[parts.length - 1];

};

const Loader = () => {

return

}

const FilePreview = createClass({

getInitialState() {

return {

loading: true

}

},

getDefaultProps(){

return {

onRemove: () => {}

}

},

componentWillMount() {

this.loadData();

},

componentWillReceiveProps(newProps) {

this.loadData(newProps.data)

},

loadData(data = this.props.data) {

if (!data) {

return;

}

const reader = new FileReader();

const type = do {

if (data.type.match('text')) {

'text'

} else if (data.type.match('image')) {

'image'

} else {

data.type

}

}

reader.onload = (e) => {

const src = e.target.result;

this.setState({

src,

type,

loading: false

});

}

if (type === 'text') {

reader.readAsText(data);

} else if (type === 'image') {

reader.readAsDataURL(data);

} else {

this.setState({

src: false,

type,

loading: false

});

}

},

render() {

const loading = do {

if (this.state.loading) {

'loading data...'

} else {

null

}

}

const uploading = do {

if (this.props.data.loading) {

} else {

null

}

}

const preview = do {

if (!this.state.loading && !this.props.data.loading) {

if (this.state.type === 'text') {

{this.state.src}

} else if (this.state.type === 'image') {

preview

} else {

no preview

}

} else {

null

}

}

const classes = [

styles.previewItem,

this.props.data.loading ? styles.disabled:''

].join(' ').trim()

return (

{uploading}

{loading}

{preview}

{this.props.data.name}

onClick={this.props.onRemove}>

remove

onClick={this.props.onUpload}>

upload

);

}

})

const FileUpload = React.createClass({

getInitialState() {

return {

fileList: []

}

},

handleDragOver(e) {

if ('preventDefault' in e) {

e.stopPropagation();

e.preventDefault();

}

const hoverState = do {

if (e.type === 'dragover') {

styles.hover

} else {

null

}

}

this.setState({

hoverState

})

},

handleFileSelect(e) {

this.handleDragOver(e);

const files = e.target.files || e.dataTransfer.files;

const fileList = Object.keys(files).map(file => files[file]);

this.setState({

fileList

});

},

removeItem(index) {

const fileList = this.state.fileList;

fileList.splice(index,1);

this.setState({

fileList

});

},

removeFile(file) {

const fileList = this.state.fileList;

const index = fileList.indexOf(file);

this.removeItem(index);

},

uploadFile(file){

return new Promise((resolve, reject) => {

const fileList = this.state.fileList;

const index = fileList.indexOf(file);

fileList[index].loading = true;

this.setState({fileList});

if (typeof file === 'file' || !('size' in file)) {

return reject(new Error('No file size'));

}

this.props.onUpload(file).then((data)=>{

resolve(data);

});

});

},

previews() {

return this.state.fileList.map((file, index) => {

const removeItem = () => {

this.removeItem(index);

}

const uploadFile = () => {

this.uploadFile(file).then(()=>{

this.removeFile(file);

});

}

return (

data={file}

onRemove={removeItem}

onUpload={uploadFile}/>

);

});

},

uploadFiles(){

this.state.fileList.forEach(file=>{

this.uploadFile(file).then(()=>{

this.removeFile(file);

});

});

},

selectFile(e) {

e.preventDefault();

this.input.click(e);

},

render() {

const {

maxSize,

name,

multiple,

label

} = this.props;

const dragClasses = [

styles.fileDrag,

this.state.hoverState

].join(' ').trim();

const fileExt = do {

if (this.state.fileList.length === 1) {

if (this.state.fileList[0].type) {

`.${getExtFromType(this.state.fileList[0].type)}`;

} else {

`.${getExtFromName(this.state.fileList[0].name)}`;

}

} else {

null;

}

};

const extTail = do {

if (fileExt) {

{fileExt}

} else {

null;

}

}

const fileNames = do {

if (this.state.fileList.length > 1) {

`${this.state.fileList.length} Files`

} else if (this.state.fileList.length === 1) {

this.state.fileList[0].name.replace(fileExt, '');

} else {

'No file chosen';

}

}

return (

{label}

onDragOver={this.handleDragOver}

onDragLeave={this.handleDragOver}

onDrop={this.handleFileSelect}>

tabIndex='-1'

ref={x => this.input = x}

className={styles.input}

name={name}

multiple={multiple}

onChange={this.handleFileSelect}/>

type='button'

onClick={this.selectFile}>

Choose Files

{fileNames}

{extTail}

or drop files here

type='button'

onClick={this.uploadFiles}>

Upload All

{this.previews()}

);

}

});

const app = document.getElementById('app');

render(

name='example-upload'

maxSize={300000}

onUpload={uploadFileToServer}

label='Upload Files'/>, app)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt android程序联网死机,Qt for Android(九) ——APP 崩溃卡死拉起保活实战

这篇文章要基于前面的基础,我们才能继续下面的内容,建议阅读。背景首先,本文的案例环境基于一些特殊的 android 设备,比如瑞星微的RK系列,在该设备上不会熄屏,没有锁屏键,运行的应用也仅限于几个…

rootfs 制作ubuntu_Ubuntu12笔记: 基于busybox的Linux小系统制作

开发环境:Ubuntu 12.04开发板:mini2440256M NandFlash 64M SDRAM交叉编译器:arm-linux-gcc 4.4.3点此可下载BusyBox版本:busybox-1.13.3点此可下载yaffs制作工具:mkyaffsimageyaffs2制作工具:mkyaffs2image(适合64M)、…

菜鸟教程android布局,Android菜鸟级教程

本文列举了一些网站的搜索引擎优化菜鸟级别的教程。  网站内容是搜索引擎优化的第一要素  1. 大量的原创内容能够...一个***的基本技能1、***的精神态度是很重要的,但技术则更是重要。***的态度虽然是无可取代,随著新科技的发明和旧技术的…

python中csv模块是自带的吗_python csv模块 Python的CSV模块,怎么新建为添加模式

在python 3.5.2中csv模块怎么 安装首先打开cmd,Ctrl R快捷键。输入cmd,点击回车。在cmd命令窗口输入python,检查环境是否配置好。退出环境exit()。输入 pip install opencv-python点击回车安装。安装完成后提示安装成功。python csv在哪个模块python csv模块问题请…

android surfaceview camera,android – 如何在SurfaceView上显示相机预览?

要使用Camera2 API从相机显示预览,您应该执行以下步骤:>获得使用相机设备的权限>使用CameraManager打开与相机的连接准备表面预览>使用打开的相机设备和所需的曲面(它不仅可以包括预览曲面)创建CaptureSession> CaptureSession创建后,您需要创建并配置C…

移除apt源_apt提示处理归档 (--unpack)时出错的解决办法

#apt##Ubuntu##Debian#1、问题现象今天在升级软件的时候遇到一个错误,如下:rootx:~# apt --fix-broken install正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 正在修复依赖关系... 完成下列软件包是自动安装的并且现…

英雄无敌3高清 Android,安卓TOP10:《英雄无敌3》高清重制版上架

安卓TOP10:TOP.5《人体保卫战(Defend Your Life!)》《人体保卫战(Defend Your Life!)》是一款策略塔防游戏。游戏中,玩家压迫扮演保护人体健康的哨兵总指挥,保护体内极为重要的免疫系统,与各种细菌和病毒展开对垒攻防,…

mysql 重启_mysql重启的问题

一.问题描述今天直接重启了用户中心库的mysql进程,数据库起来后,一直报错Too many connections。机器负载飙升到100了。登陆到mysql中,发现很多连接的状态都是logging slow query,分析慢查询日志,发现那段时间内慢查询有7万多。二…

android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...

Android精选源码Android优质博客前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思路可以查看这篇如何打造一个 Android 编译时注解框架。但是当投入笔者自己项目…

zip版mysql5.6_mysql 5.6 压缩包版安装方法

Mysql安装的时候可以有msi安装和zip解压缩两种安装方式。zip压缩包解压到目录,要使用它还需对它进行一定的配置。下面对Mysql压缩包版的安装方法进行详细的描述,要是此文有不正确的认识,希望大家指正,非常感谢。一、下载mysql压缩…

鸿蒙系统 产品,华为首款鸿蒙系统产品成行业公敌!只因开机无广告:遭十大品牌批评...

【4月6日讯】随着荣耀30s手机正式发布,全新的麒麟820处理器也是再次给我们带来了巨大惊喜,毫无疑问,麒麟820处理器将会继续继承麒麟810处理器的“神U”特质,成为5G网络时代的新一代中端“神U”,但在荣耀30s发布会上&am…

行列转换的帖子mysql_[转载]mysql行列转换方法总结  (转)

数据样本:create tabletx(id int primary key,c1 char(2),c2 char(2),c3 int);insert into txvalues(1 ,A1,B1,9),(2 ,A2,B1,7),(3 ,A3,B1,4),(4 ,A4,B1,2),(5 ,A1,B2,2),(6 ,A2,B2,9),(7 ,A3,B2,8),(8 ,A4,B2,5),(9 ,A1,B3,1),(10 ,A2,B3,8),(11 ,A3,B3,8),(12 ,A4…

mysql 查询一个月的时间_mysql日期查询sql语句总结(查询一天,查询一周,查询一个月的数据)...

我的日期首先我们获取到的日期格式是这样的:2009-2-12或者2009-3-3或者2009-10-12,我们在组合sql语句的时候可以这样:(分了三个例子)代码如下1select * from user where birthday>2009-2-3 and birthday这样我们能够查到所有包括2009-2-3并…

html在线摄像头,在HTML里加载摄像头的方法

效果图: 整体效果:视频加载:拍照:第一步:创建HTML元素首先,我们要创建一个HTML5的文档。无标题文档然后在插入以下代码:截图第二步:创建JavaScript首先,要在里创建一个JavaScript&am…

node mysql 跨库查询_nodejs 在mongodb在跨数据库之中如何进行关联起来查询,并且支持筛选关联表的条件进行查询...

"班级数据库": "mongodb://192.168.3.17/xxx"学生数据库": "mongodb://192.168.3.99/xxx (只读)使用 mongoose.createConnection 进行链接2个数据库classId 是唯一并且不会重复的。学生数据库是只读的,并且数量非常大,并随…

html5群组选择器,css选择器

基本选择器通配选择器选择器:*类型:通配选择器含义:选择文档中所有的HTML元素元素选择器选择器:E类型:元素选择器含义:选择指定类型的HTML元素ID选择器选择器:#ID类型:ID选择器含义&…

html风车相册代码,Css Html 大风车(示例代码)

简介这篇文章主要介绍了Css Html 大风车(示例代码)以及相关的经验技巧,文章约3675字,浏览量138,点赞数2,值得参考!div{ border-radius: 50%;position: absolute; }.red{border-top:100px solid red;border-right: 100p…

mysql 视图 教程_MySQL视图简介及基本操作教程

前言视图是数据库系统中一种非常有用的数据库对象。MySQL 5.0 之后的版本添加了对视图的支持。认识视图视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。视图是从…

计算机科学导论考试A卷试题,09级计算机科学导论A卷答案

《计算机科学导论》试卷A参考答案一、单选题:(每题1分,共30分)1~5 CBCCD 6~10 ABABC 11~15 DCCDD 16~20 BBBAC 21~25 DDCDC 26~30 ACABC二、填空题:(每空1分,共20分) 1.322.ROM RAM 3.地址4&…

java中连接mysql数据库_java中怎么连接mysql数据库

展开全部import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.text.SimpleDateFormat;import java.util.Date;public class JDBCMySQL {// 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中public static fi…