Javascript 我正在使用react图像裁剪与react和Express来上传带有裁剪的个人资料图片
正在尝试使用上载裁剪的图像 然后就这样 我可以从src上传基本文件,但请注意裁剪的图像src。谁能告诉我如何获得裁剪的图像,制作文件并上传 这是我的ProfilePic组件-Javascript 我正在使用react图像裁剪与react和Express来上传带有裁剪的个人资料图片,javascript,reactjs,mongodb,express,Javascript,Reactjs,Mongodb,Express,正在尝试使用上载裁剪的图像 然后就这样 我可以从src上传基本文件,但请注意裁剪的图像src。谁能告诉我如何获得裁剪的图像,制作文件并上传 这是我的ProfilePic组件- import React, { Component } from "react"; import { connect } from "react-redux"; import PropTypes from "prop-types"; impor
import React, { Component } from "react";
import { connect } from "react-redux";
import PropTypes from "prop-types";
import ReactCrop from "react-image-crop";
import "react-image-crop/dist/ReactCrop.css";
import { setProfilePic } from "../../actions/authAction";
// https://codesandbox.io/s/72py4jlll6
class ProfilePic extends Component {
constructor(props) {
super(props);
this.state = {
src: null,
crop: { x: 10, y: 10, aspect: 1, width: 50 },
selectedFile: null,
croppedImageUrl: null
};
this.onProfileImageSubmit = this.onProfileImageSubmit.bind(this);
}
b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || "";
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, { type: contentType });
return blob;
}
onProfileImageSubmit(e) {
e.preventDefault();
var ImageURL = this.state.src;
var block = ImageURL.split(";");
var contentType = block[0].split(":")[1];
var realData = block[1].split(",")[1];
var blob = this.b64toBlob(realData, contentType);
console.log(blob);
const data = new FormData();
data.append("profilePic", blob);
this.props.setProfilePic(data);
}
onSelectFile = e => {
this.setState({ selectedFile: e.target.files });
if (e.target.files && e.target.files.length > 0) {
const reader = new FileReader();
reader.addEventListener("load", () =>
this.setState({ src: reader.result })
);
reader.readAsDataURL(e.target.files[0]);
}
};
onImageLoaded = (image, pixelCrop) => {
this.imageRef = image;
// Make the library regenerate aspect crops if loading new images.
const { crop } = this.state;
if (crop.aspect && crop.height && crop.width) {
this.setState({
crop: { ...crop, height: null }
});
} else {
this.makeClientCrop(crop, pixelCrop);
}
};
onCropComplete = (crop, pixelCrop) => {
this.makeClientCrop(crop, pixelCrop);
};
onCropChange = crop => {
this.setState({ crop });
};
async makeClientCrop(crop, pixelCrop) {
if (this.imageRef && crop.width && crop.height) {
const croppedImageUrl = await this.getCroppedImg(
this.imageRef,
pixelCrop,
"newFile.jpeg"
);
this.setState({ croppedImageUrl });
}
}
getCroppedImg(image, pixelCrop, fileName) {
const canvas = document.createElement("canvas");
canvas.width = pixelCrop.width;
canvas.height = pixelCrop.height;
const ctx = canvas.getContext("2d");
ctx.drawImage(
image,
pixelCrop.x,
pixelCrop.y,
pixelCrop.width,
pixelCrop.height,
0,
0,
pixelCrop.width,
pixelCrop.height
);
return new Promise((resolve, reject) => {
canvas.toBlob(blob => {
blob.name = fileName;
window.URL.revokeObjectURL(this.fileUrl);
this.fileUrl = window.URL.createObjectURL(blob);
resolve(this.fileUrl);
}, "image/jpeg");
});
}
render() {
const { croppedImageUrl } = this.state;
return (
<div>
<div
className="modal fade"
id="update-header-photo"
tabindex="-1"
role="dialog"
aria-labelledby="update-header-photo"
aria-hidden="false"
>
<div
className="modal-dialog window-popup update-header-photo"
role="document"
>
<div className="modal-content">
<a
href="#"
className="close icon-close"
data-dismiss="modal"
aria-label="Close"
>
<i class="fa fa-user mr-3" aria-hidden="true" />
</a>
<div className="modal-header">
<h6 className="title">Update Header Photo</h6>
</div>
<div className="modal-body">
<a
href="#"
className="upload-photo-item"
style={{ width: "100%" }}
>
<form onSubmit={this.onProfileImageSubmit}>
<div>
<input
type="file"
onChange={this.onSelectFile}
name="profilePic"
/>
</div>
{this.state.src && (
<ReactCrop
src={this.state.src}
crop={this.state.crop}
onImageLoaded={this.onImageLoaded}
onComplete={this.onCropComplete}
onChange={this.onCropChange}
/>
)}
{croppedImageUrl && (
<img alt="Crop" src={croppedImageUrl} />
)}
<h6>Upload Photo</h6>
<span>Browse your computer.</span>
<input
className="btn btn-primary btn-lg full-width"
type="submit"
value="save"
/>
</form>
</a>
</div>
</div>
</div>
</div>
</div>
);
}
}
export default connect(
null,
{ setProfilePic }
)(ProfilePic);
import React,{Component}来自“React”;
从“react redux”导入{connect};
从“道具类型”导入道具类型;
从“反应图像裁剪”导入反应裁剪;
导入“react image crop/dist/ReactCrop.css”;
从“../../actions/authAction”导入{setProfilePic}”;
// https://codesandbox.io/s/72py4jlll6
类ProfilePic扩展组件{
建造师(道具){
超级(道具);
此.state={
src:null,
裁剪:{x:10,y:10,纵横比:1,宽度:50},
selectedFile:null,
croppedImageUrl:null
};
this.onProfileImageSubmit=this.onProfileImageSubmit.bind(this);
}
b64toBlob(b64Data、contentType、sliceSize){
contentType=contentType | |“”;
切片大小=切片大小| | 512;
var byteCharacters=atob(b64Data);
var ByteArray=[];
对于(变量偏移量=0;偏移量{
this.setState({selectedFile:e.target.files});
如果(e.target.files&&e.target.files.length>0){
const reader=new FileReader();
reader.addEventListener(“加载”,()=>
this.setState({src:reader.result})
);
reader.readAsDataURL(e.target.files[0]);
}
};
onImageLoaded=(图像,像素裁剪)=>{
this.imageRef=图像;
//如果加载新图像,请使库重新生成方面裁剪。
const{crop}=this.state;
if(裁剪.aspect&&crop.height&&crop.width){
这是我的国家({
裁剪:{…裁剪,高度:null}
});
}否则{
这个.makeClientCrop(crop,pixelCrop);
}
};
onCropComplete=(裁剪,像素裁剪)=>{
这个.makeClientCrop(crop,pixelCrop);
};
onCropChange=crop=>{
这个.setState({crop});
};
异步makeClientCrop(裁剪、像素裁剪){
if(this.imageRef&&crop.width&&crop.height){
const cropedimageurl=等待此消息。getcropedimg(
这是imageRef,
像素作物,
“newFile.jpeg”
);
this.setState({cropedimageurl});
}
}
getCroppedImg(图像、像素裁剪、文件名){
const canvas=document.createElement(“canvas”);
canvas.width=像素裁剪.width;
canvas.height=像素裁剪.height;
const ctx=canvas.getContext(“2d”);
ctx.drawImage(
形象,,
pixelCrop.x,
像素,
像素宽度,
像素高度,
0,
0,
像素宽度,
像素高度
);
返回新承诺((解决、拒绝)=>{
canvas.toBlob(blob=>{
blob.name=文件名;
window.URL.revokeObjectURL(this.fileUrl);
this.fileUrl=window.URL.createObjectURL(blob);
解析(this.fileUrl);
},“图像/jpeg”);
});
}
render(){
const{croppedImageUrl}=this.state;
返回(
更新标题照片
);
}
}
导出默认连接(
无效的
{setProfilePic}
)(PIC);
在getcropedimg()函数中添加this.setState({blob:blob})
并在ProfileImageSubmit()上修改:
我们不需要将base64转换为Blob。第一行您可以添加
,请告诉OP在哪里添加它?您可以添加新行:this.setState({Blob:Blob})在getCroppedImg()函数中,我们不需要将base64转换为Blob。
,一个不需要它的解释将帮助OP和其他读者清除它们的错误
canvas.toBlob(blob => {
blob.name = fileName;
window.URL.revokeObjectURL(this.fileUrl);
this.fileUrl = window.URL.createObjectURL(blob);
resolve(this.fileUrl);
this.setState({blob:blob}) //added by SO huy nguyen
}, "image/jpeg");
onProfileImageSubmit(e) {
e.preventDefault();
const data = new FormData();
data.append("profilePic", this.state.blob);
this.props.setProfilePic(data);
}