Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
H
H5Public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
CI / CD
CI / CD
流水线
作业
日程
统计图
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
前端开发小组
H5Public
Commits
c4284d75
提交
c4284d75
authored
5月 06, 2020
作者:
徐立
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
http://scjoyedu.eicp.net:9121/front-team/H5Public
上级
29d27b8a
7b0ccf28
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
150 行增加
和
0 行删除
+150
-0
index.js
HighStateComponent/UploadImage/index.js
+150
-0
没有找到文件。
HighStateComponent/UploadImage/index.js
0 → 100644
浏览文件 @
c4284d75
import
React
,
{
Component
}
from
'react'
;
import
PropTypes
from
'prop-types'
;
import
{
ImagePicker
,
Toast
}
from
'antd-mobile'
;
import
config
from
'@/config/config'
;
import
{
getToken
}
from
'@/H5Public/utils/authority'
;
/**
* 组件使用方法
*
* <Upload
ref='upload' this.refs.upload.handleSubmit() 调用子组件提交方法
handleSubmit={this.submit1} 子组件提交后返回后端数据回调函数
// rest={{disableDelete:true}} 基于antd-mobile,可使用antd自身属性---不是必填项
/>
*/
// 全局loadinng
let
loadingCount
=
0
;
class
Upload
extends
Component
{
constructor
(
props
)
{
super
(
props
)
this
.
state
=
{
files
:
[],
// 图片文件
urlList
:
[]
// 后端返回图片地址
}
}
// 图片压缩函数
zipImage
=
(
file
)
=>
{
let
fileSizeMb
=
file
.
size
/
1024
/
1024
;
let
fileName
=
file
.
name
;
if
(
fileSizeMb
<
this
.
props
.
fileSizeMb
)
{
// 1MB 以下的图片不需要压缩。
this
.
uploadCall
(
file
)
}
let
reader
=
new
FileReader
();
reader
.
readAsDataURL
(
file
);
reader
.
onload
=
(
e
)
=>
{
//这里的e.target.result就是转换后base64格式的图片文件
let
image
=
new
Image
();
//新建一个img标签(还没嵌入DOM节点)
image
.
src
=
e
.
target
.
result
;
return
image
.
onload
=
()
=>
{
let
canvas
=
document
.
createElement
(
'canvas'
);
let
context
=
canvas
.
getContext
(
'2d'
);
let
imageWidth
=
image
.
width
*
0.3
;
//压缩后图片的大小
let
imageHeight
=
image
.
height
*
0.3
;
let
data
=
''
;
canvas
.
width
=
imageWidth
;
canvas
.
height
=
imageHeight
;
context
.
drawImage
(
image
,
0
,
0
,
imageWidth
,
imageHeight
);
data
=
canvas
.
toDataURL
(
'image/jpeg'
);
let
zipFile
=
this
.
dataURLtoFile
(
data
,
fileName
);
this
.
uploadCall
(
zipFile
)
};
};
};
//将base64转换为文件
dataURLtoFile
=
(
dataurl
,
filename
)
=>
{
let
arr
=
dataurl
.
split
(
','
);
let
mime
=
arr
[
0
].
match
(
/:
(
.*
?)
;/
)[
1
];
let
bstr
=
atob
(
arr
[
1
]);
let
n
=
bstr
.
length
;
let
u8arr
=
new
Uint8Array
(
n
);
while
(
n
--
)
{
u8arr
[
n
]
=
bstr
.
charCodeAt
(
n
);
}
return
new
File
([
u8arr
],
filename
,
{
type
:
mime
});
};
// 上传本地
onChange
=
(
files
)
=>
{
this
.
setState
({
files
});
files
.
map
(
item
=>
{
this
.
uploadImg
(
item
,
(
res
)
=>
{
this
.
setState
({
urlList
:
[...
this
.
state
.
urlList
,
res
]
})
})
})
}
// 上传图片--方法
uploadImg
=
(
file
,
callback
)
=>
{
const
xhr
=
new
XMLHttpRequest
();
const
formData
=
new
FormData
();
formData
.
append
(
'file'
,
file
);
xhr
.
open
(
'post'
,
config
.
uploadUrl
+
"?token="
+
getToken
(),
true
);
xhr
.
setRequestHeader
(
"Accept"
,
"application/json;charset=UTF-8"
);
xhr
.
send
(
formData
);
xhr
.
onreadystatechange
=
()
=>
{
if
(
xhr
.
readyState
==
4
&&
xhr
.
status
==
200
)
{
const
json
=
JSON
.
parse
(
xhr
.
responseText
);
callback
(
json
.
url
)
}
}
}
// 上传后获取后端返回图片地址
uploadCall
=
(
item
)
=>
(
this
.
uploadImg
(
item
,
(
res
)
=>
{
this
.
setState
({
urlList
:
[...
this
.
state
.
urlList
,
res
]
},
()
=>
{
if
(
this
.
state
.
files
.
length
===
this
.
state
.
urlList
.
length
)
{
Toast
.
hide
()
loadingCount
=
0
;
const
{
handleSubmit
}
=
this
.
props
;
handleSubmit
(
this
.
state
.
urlList
)
// 把后端返回url传给父组件
}
})
})
)
// 提交
handleSubmit
=
()
=>
{
const
{
files
}
=
this
.
state
;
Toast
.
loading
(
'Loading...'
,
0
);
files
.
map
(
item
=>
{
loadingCount
++
this
.
zipImage
(
item
.
file
)
})
}
render
()
{
const
{
files
}
=
this
.
state
;
const
{
multiple
,
accept
,
length
,
rest
}
=
this
.
props
;
return
(
<
div
>
<
ImagePicker
files
=
{
files
}
accept
=
{
accept
}
onChange
=
{
this
.
onChange
}
selectable
=
{
files
.
length
<
length
}
multiple
=
{
multiple
}
{...
rest
}
/
>
<
/div
>
);
}
}
Upload
.
propTypes
=
{
multiple
:
PropTypes
.
bool
,
// 是否支持多选
accept
:
PropTypes
.
string
,
// 上传格式限制
length
:
PropTypes
.
number
,
// 最大支持上传张数
handleSubmit
:
PropTypes
.
func
.
isRequired
,
// 上传函数
rest
:
PropTypes
.
object
}
Upload
.
defaultProps
=
{
multiple
:
true
,
// 是否支持多选
accept
:
'image/*'
,
// 上传格式限制
length
:
10
,
// 最大支持上传张数
}
export
default
Upload
;
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论