代码拉取完成,页面将自动刷新
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>上传头像</title>
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="lib/font-awesome-4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="lib/cropperjs/cropper.min.css">
<style>
.img-container, .img-preview {
background-color: #f7f7f7;
text-align: center;
width: 100%;
}
.img-container {
height: 400px;
overflow: hidden;
}
.img-container > img, .img-preview > img {
max-width: 100%;
}
.img-preview {
float: left;
margin-bottom: 0.5rem;
margin-right: 0.5rem;
overflow: hidden;
}
.preview-lg {
height: 9rem;
width: 16rem;
}
.preview-md {
height: 4.5rem;
width: 8rem;
}
.preview-sm {
height: 2.25rem;
width: 4rem;
}
.preview-xs {
height: 1.125rem;
width: 2rem;
margin-right: 0;
}
.progress {
display: none;
}
</style>
</head>
<body class="">
<div class="container-fluid">
<br>
<div class="row">
<div class="col-sm-8">
<div class="img-container">
<img id="img-avatar" src="images/picture.jpg" alt="Picture">
</div>
</div>
<div class="col-sm-4">
<h6>图片预览:</h6>
<div class="clearfix">
<div class="img-preview preview-lg"></div>
<div class="img-preview preview-md"></div>
<div class="img-preview preview-sm"></div>
<div class="img-preview preview-xs"></div>
</div>
</div>
</div>
<!-- /.row -->
<div class="row mt-2">
<div class="col-sm-8 buttons">
<label class="btn btn-primary mb-0" for="input-image">
<input type="file" class="sr-only" id="input-image" name="file" accept="image/*">
选择 <span class="fa fa-cloud-upload"></span>
</label>
<button type="button" class="btn btn-outline-primary" data-method="reset" data-option="0" title="复位">
<i class="fa fa-refresh"></i>
</button>
<button type="button" class="btn btn-outline-primary" data-method="zoom" data-option="0.1" title="放大">
<i class="fa fa-search-plus"></i>
</button>
<button type="button" class="btn btn-outline-primary" data-method="zoom" data-option="-0.1" title="缩小">
<i class="fa fa-search-minus"></i>
</button>
<button type="button" class="btn btn-outline-primary" data-method="rotate" data-option="-90" title="左转">
<i class="fa fa-rotate-left"></i>
</button>
<button type="button" class="btn btn-outline-primary" data-method="rotate" data-option="90" title="右转">
<i class="fa fa-rotate-right"></i>
</button>
</div>
<div class="col-sm-4 text-right">
<button type="button" class="btn btn-primary" id="submit">提交</button>
</div>
</div>
<!-- /.row -->
<div class="progress mt-2">
<div class="progress-bar progress-bar-striped progress-bar-animated" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0%</div>
</div>
</div>
<!-- /.container-fluid -->
<!-- Essential javascripts for application to work-->
<script src="js/jquery.min.js"></script>
<script src="js/popper.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/main.js"></script>
<!-- The javascript plugin to display pagination loading on top-->
<script src="lib/cropperjs/cropper.min.js"></script>
<!-- Page specific javascripts-->
<script type="text/javascript">
let image = document.getElementById("img-avatar");
let input = document.getElementById("input-image");
let cropper = new Cropper(image, {
aspectRatio: 1, // 16 / 9,
viewMode: 2,
dragMode: "move",
preview: ".img-preview",
crop: function (e) {
let data = e.detail;
console.log(e.type);
console.log("dataX:", Math.round(data.x));
console.log("dataY:", Math.round(data.y));
console.log("dataHeight:", Math.round(data.height));
console.log("dataWidth:", Math.round(data.width));
console.log("dataRotate:", typeof data.rotate !== 'undefined' ? data.rotate : '');
console.log("dataScaleX:", typeof data.scaleX !== 'undefined' ? data.scaleX : '');
console.log("dataScaleY:", typeof data.scaleY !== 'undefined' ? data.scaleY : '');
}
});
$(".buttons [data-method]").click(function () {
let method = $(this).attr("data-method");
let option = $(this).attr("data-option");
switch (method) {
case "reset":
cropper.reset();
break;
case "zoom":
cropper.zoom(option);
break;
case "rotate":
cropper.rotate(option);
break;
}
});
$(input).change(function (e) {
let files = e.target.files;
let done = function (url) {
input.value = "";
image.src = url;
};
if (files && files.length > 0) {
let file = files[0];
if (URL) {
done(URL.createObjectURL(file));
} else if (FileReader) {
let reader = new FileReader();
reader.onload = function (e) {
done(reader.result);
};
reader.readAsDataURL(file);
}
cropper.replace(image.src);
}
});
$("#submit").click(function () {
if (!cropper) return false;
let canvas = cropper.getCroppedCanvas({
width: 128,
height: 128,
});
// let initialAvatarURL = avatar.src;
// avatar.src = canvas.toDataURL();
let $progressBar = $(".progress-bar");
$progressBar.width(0).attr('aria-valuenow', 0).text('0%');
let $progress = $(".progress");
$progress.show();
canvas.toBlob(function (blob) {
let formData = new FormData();
formData.append('avatar', blob, 'avatar.jpg');
formData.append('data', JSON.stringify(cropper.getData()));
$.ajax('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
data: formData,
processData: false,
contentType: false,
xhr: function () {
let xhr = new XMLHttpRequest();
xhr.upload.onprogress = function (e) {
let percent = '0';
let percentage = '0%';
if (e.lengthComputable) {
percent = Math.round((e.loaded / e.total) * 100);
percentage = percent + '%';
$progressBar.width(percentage).attr('aria-valuenow', percent).text(percentage);
}
};
return xhr;
},
success: function () {
alert('Upload success');
},
error: function () {
// avatar.src = initialAvatarURL;
alert('Upload error');
},
complete: function () {
$progress.hide();
},
});
// $.ajax end
});
});
</script>
</body>
</html>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。