layui.use(['upload', 'element', 'layer'], function(){ var upload = layui.upload; var element = layui.element; var layer = layui.layer; var $ = layui.$; // 普通文件上传 upload.render({ elem: '#fileUpload', url: '/api/uploads', headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }, data: { device_uid: function() { return $('#deviceUID').val(); }, description: function() { return $('#description').val(); } }, accept: 'file', before: function(obj) { layer.load(); }, done: function(res) { layer.closeAll('loading'); if (res.error) { layer.msg(res.error); return; } layer.msg('上传成功'); // 刷新文件列表 loadFileList(); }, error: function() { layer.closeAll('loading'); layer.msg('上传失败'); } }); // 分片上传 upload.render({ elem: '#chunkUpload', url: '/api/uploads/chunk', headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }, data: { deviceUID: function() { return $('#deviceUID').val(); } }, accept: 'file', size: 1024 * 1024 * 2, // 每片2MB chunked: true, chunkSize: 1024 * 1024 * 2, before: function(obj) { layer.load(); }, progress: function(n) { var percent = n + '%'; element.progress('uploadProgress', percent); }, done: function(res) { layer.closeAll('loading'); if (res.error) { layer.msg(res.error); return; } // 如果所有分片都上传完成,开始合并 if (res.completed) { mergeChunks(res.fileHash); } else { layer.msg('分片上传成功'); } }, error: function() { layer.closeAll('loading'); layer.msg('上传失败'); } }); // 合并分片 function mergeChunks(fileHash) { fetch('/api/uploads/merge', { method: 'POST', headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token'), 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'fileHash=' + fileHash }) .then(response => response.json()) .then(result => { if (result.error) { layer.msg(result.error); return; } layer.msg('文件合并成功'); // 刷新文件列表 loadFileList(); }) .catch(error => { layer.msg('文件合并失败:' + error.message); }); } // 加载文件列表 function loadFileList() { var deviceUID = $('#deviceUID').val(); if (!deviceUID) return; fetch('/api/uploads/device/' + deviceUID, { headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') } }) .then(response => response.json()) .then(result => { if (result.error) { layer.msg(result.error); return; } renderFileList(result); }) .catch(error => { layer.msg('加载文件列表失败:' + error.message); }); } // 渲染文件列表 function renderFileList(files) { var html = ''; files.forEach(file => { html += `