图片word文档和xsl文件转换base64案例
下面代码运行后,点击查看/预览文件按钮,如果是图片会直接展示图片,如果是word文档或者xsl文件会下载文件,这个示例主要是教怎么去使用html将word文档和xsl文件转换为base64编码
选择单个文件
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>本地文件 Base64 预览</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 40px;
}
#viewBtn {
display: none;
margin: 15px 0;
}
iframe,
img {
max-width: 100%;
border: 1px solid #ccc;
}
</style>
</head>
<body>
<h2>选择文件 → 控制台打印 Base64 → 页面预览/下载</h2>
<!-- 文件选择框 -->
<input type="file" id="fileInput" accept="image/*,.doc,.docx,.xls,.xlsx" />
<!-- 下载按钮(图片是查看,文档和xsl是下载)(隐藏状态) -->
<button id="viewBtn">查看/下载文件</button>
<!-- 预览图片区域 -->
<div id="previewArea"></div>
<script>
const fileInput = document.getElementById('fileInput');
const viewBtn = document.getElementById('viewBtn');
const preview = document.getElementById('previewArea');
let current = { name: '', type: '', base64: '', dataURL: '' };
/* 1. 选择文件 → 转 Base64 → 控制台打印 → 显示按钮 */
fileInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (evt) => {
current.dataURL = evt.target.result; // data:...;base64,XXXX
current.base64 = current.dataURL.split(',')[1];
current.name = file.name;
current.type = file.type;
console.log('=== Base64 字符串 ===');
console.log(current.base64);
viewBtn.style.display = 'inline-block'; // 显示按钮
preview.innerHTML = ''; // 清空旧预览
};
// 必须加下面这行代码,这个渲染完毕才会触发上面的onload事件
// 这个事件会在文件读取完成后触发,并将文件内容作为 Data URL 赋值给 result 属性
reader.readAsDataURL(file);
});
/* 2. 点击「下载」→ 根据文件类型下载,图片的话直接显示,文档,xsl都是直接下载 */
viewBtn.addEventListener('click', () => {
preview.innerHTML = '';
if (current.type.startsWith('image/')) {
const img = document.createElement('img');
img.src = current.dataURL;
preview.appendChild(img);
} else {
// 直接下载文件
const blob = b64toBlob(current.base64, current.type);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = current.name;
a.click();
URL.revokeObjectURL(url);
}
});
/* Base64 → Blob 小工具 */
function b64toBlob(b64, type) {
const bytes = atob(b64);
const ab = new ArrayBuffer(bytes.length);
const ia = new Uint8Array(ab);
for (let i = 0; i < bytes.length; i++) ia[i] = bytes.charCodeAt(i);
return new Blob([ab], { type });
}
</script>
</body>
</html>批量选择多个文件
js
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>多文件 Base64 预览/下载</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 40px;
}
ul {
list-style: none;
padding: 0;
}
li {
margin-bottom: 20px;
border: 1px solid #ccc;
padding: 10px;
border-radius: 4px;
max-width: 600px;
}
img {
max-width: 200px;
display: block;
margin-top: 8px;
}
button {
margin-top: 8px;
padding: 5px 12px;
cursor: pointer;
}
</style>
</head>
<body>
<h2>选择多个文件 → 控制台打印 Base64 → 页面预览/下载</h2>
<!-- 多选文件 -->
<input
type="file"
id="fileInput"
multiple
accept="image/*,.doc,.docx,.xls,.xlsx"
/>
<!-- 预览区域 -->
<div id="previewArea"></div>
<script>
const fileInput = document.getElementById('fileInput');
const preview = document.getElementById('previewArea');
let filesData = [];
/* 1. 选择多个文件 → 转 Base64 → 控制台打印 → 显示按钮 */
fileInput.addEventListener('change', async (e) => {
const files = Array.from(e.target.files);
if (!files.length) return;
preview.innerHTML = '处理中...';
filesData = [];
for (const file of files) {
const dataURL = await readFileAsDataURL(file);
filesData.push({
name: file.name,
type: file.type,
dataURL,
base64: dataURL.split(',')[1],
});
console.log(`=== ${file.name} 的 Base64 ===`);
console.log(dataURL.split(',')[1]);
}
preview.innerHTML = '';
renderPreviewList();
});
/* 封装 FileReader Promise */
function readFileAsDataURL(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => resolve(e.target.result);
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
/* 2. 渲染预览列表(图片直接显示,文档提供下载按钮) */
function renderPreviewList() {
const ul = document.createElement('ul');
filesData.forEach((f) => {
const li = document.createElement('li');
const title = document.createElement('strong');
title.textContent = f.name;
li.appendChild(title);
if (f.type.startsWith('image/')) {
const img = document.createElement('img');
img.src = f.dataURL;
li.appendChild(img);
} else {
const downloadBtn = document.createElement('button');
downloadBtn.textContent = '下载';
downloadBtn.onclick = () => downloadFile(f);
li.appendChild(downloadBtn);
}
ul.appendChild(li);
});
preview.appendChild(ul);
}
/* 3. 下载非图片文件 */
function downloadFile({ base64, type, name }) {
const blob = b64toBlob(base64, type);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = name;
a.click();
URL.revokeObjectURL(url);
}
/* Base64 → Blob 小工具 */
function b64toBlob(b64, type) {
const bytes = atob(b64);
const ab = new ArrayBuffer(bytes.length);
const ia = new Uint8Array(ab);
for (let i = 0; i < bytes.length; i++) ia[i] = bytes.charCodeAt(i);
return new Blob([ab], { type });
}
</script>
</body>
</html>