方案一
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>头像</title>
</head>
<script src="http://i.gtimg.cn/qzone/biz/gdt/lib/jquery/jquery-2.1.4.js?max_age=31536000"></script>
<script src="js/avator.js"></script>
<body>
<input type="file" id="upLoad" name="image">
<div id='previewImg'>
<img src="" id='viewImg' style="height: 200px;"/>
</div>
<button id="submit">提交</button>
</body>
</html>
$(function () {
var imgsrc = ''
$("#submit").click(function () {
alert(imgsrc);
$.ajax({
url: '/avatar',
type: 'POST',
dataType: 'json',
data: {
'imgsrc': imgsrc
},
success: function (res) {
alert('666');
},
error: function () {
alert('123');
}
});
});
$('#upLoad').on('change', function () {
var filePath = $(this).val(),
fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(),
imgBase64 = '',
fileObj = document.getElementById('upLoad').files[0];
if (!fileFormat.match(/.png|.jpg|.jpeg/)) {
alert('上传错误,文件格式必须为:png/jpg/jpeg');
return;
}
alert(fileObj.size / 1024);
if (fileObj.size / 1024 > 20000) {
compress(fileObj, function (imgBase64) {
imgBase64 = imgBase64;
imgsrc = imgBase64;
$('#viewImg').attr('src', imgBase64);
});
} else {
directTurnIntoBase64(fileObj, function (imgBase64) {
imgBase64 = imgBase64;
imgsrc = imgBase64;
$('#viewImg').attr('src', imgBase64);
});
}
});
function directTurnIntoBase64(fileObj, callback) {
var r = new FileReader();
r.onload = function () {
imgBase64 = r.result;
console.log(imgBase64);
callback(imgBase64);
}
r.readAsDataURL(fileObj);
}
function compress(fileObj, callback) {
if (typeof (FileReader) === 'undefined') {
console.log("当前浏览器内核不支持base64图标压缩");
directTurnIntoBase64(fileObj, callback);
} else {
try {
var reader = new FileReader();
reader.onload = function (e) {
var image = $('<img/>');
image.load(function () {
square = 390,
canvas = document.createElement('canvas'),
context = canvas.getContext('2d'),
imageWidth = 0,
imageHeight = 0,
offsetX = 0,
offsetY = 0,
data = '';
canvas.width = square;
canvas.height = square;
context.clearRect(0, 0, square, square);
if (this.width > this.height) {
imageWidth = Math.round(square * this.width / this.height);
imageHeight = square;
offsetX = -Math.round((imageWidth - square) / 2);
} else {
imageHeight = Math.round(square * this.height / this.width);
imageWidth = square;
offsetY = -Math.round((imageHeight - square) / 2);
}
context.drawImage(this, offsetX, offsetY, imageWidth, imageHeight);
var data = canvas.toDataURL('image/jpeg');
callback(data);
});
image.attr('src', e.target.result);
};
reader.readAsDataURL(fileObj);
} catch (e) {
console.log("压缩失败!");
directTurnIntoBase64(fileObj, callback);
}
}
}
});
方案2
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="file"><br>
<img src="" height="200" alt="Image preview area..." title="preview-img">
<script>
var fileInput = document.querySelector('input[type=file]'),
previewImg = document.querySelector('img');
fileInput.addEventListener('change', function () {
var file = this.files[0];
var reader = new FileReader();
// 监听reader对象的的onload事件,当图片加载完成时,把base64编码賦值给预览图片
reader.addEventListener("load", function () {
previewImg.src = reader.result;
}, false);
// 调用reader.readAsDataURL()方法,把图片转成base64
reader.readAsDataURL(file);
}, false);
</script>
</body>
</html>
参考:
https://www.cnblogs.com/xh_Blog/p/8269581.html
<h3><a id="_0"></a>方案一</h3>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-meta"><!DOCTYPE <span class="hljs-keyword">HTML</span> <span class="hljs-keyword">PUBLIC</span> <span class="hljs-string">"-//W3C//DTD HTML 4.01 Transitional//EN"</span> <span class="hljs-string">"http://www.w3.org/TR/html4/loose.dtd"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">html</span>></span>
<span class="hljs-tag"><<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">title</span>></span>头像<span class="hljs-tag"></<span class="hljs-name">title</span>></span>
<span class="hljs-tag"></<span class="hljs-name">head</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"http://i.gtimg.cn/qzone/biz/gdt/lib/jquery/jquery-2.1.4.js?max_age=31536000"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"js/avator.js"</span>></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span>
<span class="hljs-tag"><<span class="hljs-name">body</span>></span>
<span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"upLoad"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"image"</span>></span>
<span class="hljs-comment"><!-- 显示上传之后的图片 --></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">'previewImg'</span>></span>
<span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">""</span> <span class="hljs-attr">id</span>=<span class="hljs-string">'viewImg'</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"height: 200px;"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"submit"</span>></span>提交<span class="hljs-tag"></<span class="hljs-name">button</span>></span>
<span class="hljs-tag"></<span class="hljs-name">body</span>></span>
<span class="hljs-tag"></<span class="hljs-name">html</span>></span>
</code></div></pre>
<pre><div class="hljs"><code class="lang-javascript">$(<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">var</span> imgsrc = <span class="hljs-string">''</span>
$(<span class="hljs-string">"#submit"</span>).<span class="hljs-title function_">click</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-title function_">alert</span>(imgsrc);
$.<span class="hljs-title function_">ajax</span>({
<span class="hljs-attr">url</span>: <span class="hljs-string">'/avatar'</span>,
<span class="hljs-attr">type</span>: <span class="hljs-string">'POST'</span>,
<span class="hljs-attr">dataType</span>: <span class="hljs-string">'json'</span>,
<span class="hljs-attr">data</span>: {
<span class="hljs-string">'imgsrc'</span>: imgsrc
},
<span class="hljs-attr">success</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params">res</span>) {
<span class="hljs-title function_">alert</span>(<span class="hljs-string">'666'</span>);
},
<span class="hljs-attr">error</span>: <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-title function_">alert</span>(<span class="hljs-string">'123'</span>);
}
});
});
$(<span class="hljs-string">'#upLoad'</span>).<span class="hljs-title function_">on</span>(<span class="hljs-string">'change'</span>, <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">var</span> filePath = $(<span class="hljs-variable language_">this</span>).<span class="hljs-title function_">val</span>(), <span class="hljs-comment">//获取到input的value,里面是文件的路径</span>
fileFormat = filePath.<span class="hljs-title function_">substring</span>(filePath.<span class="hljs-title function_">lastIndexOf</span>(<span class="hljs-string">"."</span>)).<span class="hljs-title function_">toLowerCase</span>(),
imgBase64 = <span class="hljs-string">''</span>, <span class="hljs-comment">//存储图片的imgBase64</span>
fileObj = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'upLoad'</span>).<span class="hljs-property">files</span>[<span class="hljs-number">0</span>]; <span class="hljs-comment">//上传文件的对象,要这样写才行,用jquery写法获取不到对象</span>
<span class="hljs-comment">// 检查是否是图片</span>
<span class="hljs-keyword">if</span> (!fileFormat.<span class="hljs-title function_">match</span>(<span class="hljs-regexp">/.png|.jpg|.jpeg/</span>)) {
<span class="hljs-title function_">alert</span>(<span class="hljs-string">'上传错误,文件格式必须为:png/jpg/jpeg'</span>);
<span class="hljs-keyword">return</span>;
}
<span class="hljs-title function_">alert</span>(fileObj.<span class="hljs-property">size</span> / <span class="hljs-number">1024</span>);
<span class="hljs-keyword">if</span> (fileObj.<span class="hljs-property">size</span> / <span class="hljs-number">1024</span> > <span class="hljs-number">20000</span>) {
<span class="hljs-comment">// alert('大于200k');</span>
<span class="hljs-comment">// 调用函数,对图片进行压缩</span>
<span class="hljs-title function_">compress</span>(fileObj, <span class="hljs-keyword">function</span> (<span class="hljs-params">imgBase64</span>) {
imgBase64 = imgBase64; <span class="hljs-comment">//存储转换的base64编码</span>
imgsrc = imgBase64;
$(<span class="hljs-string">'#viewImg'</span>).<span class="hljs-title function_">attr</span>(<span class="hljs-string">'src'</span>, imgBase64); <span class="hljs-comment">//显示预览图片</span>
});
} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">// alert('小于200k');</span>
<span class="hljs-comment">// 调用函数,不对图片进行压缩</span>
<span class="hljs-title function_">directTurnIntoBase64</span>(fileObj, <span class="hljs-keyword">function</span> (<span class="hljs-params">imgBase64</span>) {
imgBase64 = imgBase64; <span class="hljs-comment">//存储转换的base64编码</span>
imgsrc = imgBase64;
$(<span class="hljs-string">'#viewImg'</span>).<span class="hljs-title function_">attr</span>(<span class="hljs-string">'src'</span>, imgBase64); <span class="hljs-comment">//显示预览图片</span>
});
}
});
<span class="hljs-comment">// 不对图片进行压缩,直接转成base64</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">directTurnIntoBase64</span>(<span class="hljs-params">fileObj, callback</span>) {
<span class="hljs-keyword">var</span> r = <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileReader</span>();
<span class="hljs-comment">// 转成base64</span>
r.<span class="hljs-property">onload</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-comment">//变成字符串</span>
imgBase64 = r.<span class="hljs-property">result</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(imgBase64);
<span class="hljs-title function_">callback</span>(imgBase64);
}
r.<span class="hljs-title function_">readAsDataURL</span>(fileObj); <span class="hljs-comment">//转成Base64格式</span>
}
<span class="hljs-comment">// 对图片进行压缩</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">compress</span>(<span class="hljs-params">fileObj, callback</span>) {
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> (<span class="hljs-title class_">FileReader</span>) === <span class="hljs-string">'undefined'</span>) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"当前浏览器内核不支持base64图标压缩"</span>);
<span class="hljs-comment">//调用上传方式不压缩</span>
<span class="hljs-title function_">directTurnIntoBase64</span>(fileObj, callback);
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">var</span> reader = <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileReader</span>();
reader.<span class="hljs-property">onload</span> = <span class="hljs-keyword">function</span> (<span class="hljs-params">e</span>) {
<span class="hljs-keyword">var</span> image = $(<span class="hljs-string">'<img/>'</span>);
image.<span class="hljs-title function_">load</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
square = <span class="hljs-number">390</span>, <span class="hljs-comment">//定义画布的大小,也就是图片压缩之后的像素</span>
canvas = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'canvas'</span>),
context = canvas.<span class="hljs-title function_">getContext</span>(<span class="hljs-string">'2d'</span>),
imageWidth = <span class="hljs-number">0</span>, <span class="hljs-comment">//压缩图片的大小</span>
imageHeight = <span class="hljs-number">0</span>,
offsetX = <span class="hljs-number">0</span>,
offsetY = <span class="hljs-number">0</span>,
data = <span class="hljs-string">''</span>;
canvas.<span class="hljs-property">width</span> = square;
canvas.<span class="hljs-property">height</span> = square;
context.<span class="hljs-title function_">clearRect</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, square, square);
<span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">width</span> > <span class="hljs-variable language_">this</span>.<span class="hljs-property">height</span>) {
imageWidth = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">round</span>(square * <span class="hljs-variable language_">this</span>.<span class="hljs-property">width</span> / <span class="hljs-variable language_">this</span>.<span class="hljs-property">height</span>);
imageHeight = square;
offsetX = -<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">round</span>((imageWidth - square) / <span class="hljs-number">2</span>);
} <span class="hljs-keyword">else</span> {
imageHeight = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">round</span>(square * <span class="hljs-variable language_">this</span>.<span class="hljs-property">height</span> / <span class="hljs-variable language_">this</span>.<span class="hljs-property">width</span>);
imageWidth = square;
offsetY = -<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">round</span>((imageHeight - square) / <span class="hljs-number">2</span>);
}
context.<span class="hljs-title function_">drawImage</span>(<span class="hljs-variable language_">this</span>, offsetX, offsetY, imageWidth, imageHeight);
<span class="hljs-keyword">var</span> data = canvas.<span class="hljs-title function_">toDataURL</span>(<span class="hljs-string">'image/jpeg'</span>);
<span class="hljs-comment">//压缩完成执行回调</span>
<span class="hljs-title function_">callback</span>(data);
});
image.<span class="hljs-title function_">attr</span>(<span class="hljs-string">'src'</span>, e.<span class="hljs-property">target</span>.<span class="hljs-property">result</span>);
};
reader.<span class="hljs-title function_">readAsDataURL</span>(fileObj);
} <span class="hljs-keyword">catch</span> (e) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"压缩失败!"</span>);
<span class="hljs-comment">//调用直接上传方式 不压缩</span>
<span class="hljs-title function_">directTurnIntoBase64</span>(fileObj, callback);
}
}
}
});
</code></div></pre>
<h3><a id="2_147"></a>方案2</h3>
<pre><div class="hljs"><code class="lang-javascript"><!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="file"><br>
<img src="" height="200" alt="Image preview area..." title="preview-img">
<script>
var fileInput = document.querySelector('input[type=file]'),
previewImg = document.querySelector('img');
fileInput.addEventListener('change', function () {
var file = this.files[0];
var reader = new FileReader();
// 监听reader对象的的onload事件,当图片加载完成时,把base64编码賦值给预览图片
reader.addEventListener("load", function () {
previewImg.src = reader.result;
}, false);
// 调用reader.readAsDataURL()方法,把图片转成base64
reader.readAsDataURL(file);
}, false);
</script>
</body>
</html>
</code></div></pre>
<p>参考:<br />
https://www.cnblogs.com/xh_Blog/p/8269581.html</p>
留言