Files
hzdyjs/docs/变更管理/code-adjust-record-2025-01-27-image-upload-security-upgrade.md
T
2025-08-02 21:06:47 +08:00

5.8 KiB

图片上传组件安全升级变更记录

📋 变更概述

变更时间: 2025-01-27 15:30:00
变更类型: 功能增强 - 安全升级
影响范围: 前端图片上传组件
变更原因: 配合MinIO安全改造,增强文件上传安全性

🔧 具体变更

1. 文件修改

  • 文件路径: web/src/components/ImageUpload/index.vue
  • 变更类型: 功能增强
  • 主要改动:
    • 添加bucket密码验证功能
    • 实现自定义上传方法
    • 增加密码输入对话框
    • 升级预览功能为安全预览

2. 新增功能

2.1 Bucket密码验证

// 新增Props参数
interface Props {
  // bucket访问密码
  bucketPassword?: string;
  
  // 是否启用bucket密码验证
  enablePasswordValidation?: boolean;
}

2.2 自定义上传方法

// 自定义上传方法
const customUpload = async (options: any) => {
  try {
    // 检查是否需要bucket密码验证
    if (props.enablePasswordValidation && !props.bucketPassword) {
      // 显示密码输入对话框
      pendingUploadFile.value = options;
      passwordDialogVisible.value = true;
      return;
    }

    // 直接上传
    await performUpload(options);
  } catch (error) {
    console.error('上传失败:', error);
    proxy?.$modal.msgError('上传失败');
    proxy?.$modal.closeLoading();
  }
};

2.3 密码输入对话框

<!-- Bucket密码输入对话框 -->
<el-dialog v-model="passwordDialogVisible" title="Bucket访问密码" width="400px" append-to-body>
  <el-form :model="passwordForm" label-width="100px">
    <el-form-item label="Bucket密码" required>
      <el-input
        v-model="passwordForm.bucketPassword"
        type="password"
        placeholder="请输入bucket访问密码"
        show-password
        @keyup.enter="confirmPassword"
      />
    </el-form-item>
  </el-form>
  <template #footer>
    <span class="dialog-footer">
      <el-button @click="passwordDialogVisible = false">取消</el-button>
      <el-button type="primary" @click="confirmPassword">确认</el-button>
    </span>
  </template>
</el-dialog>

2.4 安全上传实现

// 执行上传
const performUpload = async (options: any) => {
  try {
    const formData = new FormData();
    formData.append('file', options.file);

    // 使用新的安全上传接口
    const response = await fetch(uploadImgUrl.value, {
      method: 'POST',
      headers: {
        ...headers.value,
        'bucket-password': props.bucketPassword || passwordForm.value.bucketPassword || ''
      },
      body: formData
    });

    if (!response.ok) {
      throw new Error('上传失败');
    }

    const result = await response.json();
    
    if (result.code === 200) {
      // 上传成功
      const uploadResult = {
        name: result.data.fileName,
        url: result.data.url,
        ossId: result.data.ossId
      };
      
      uploadList.value.push(uploadResult);
      uploadedSuccessfully();
    } else {
      throw new Error(result.msg || '上传失败');
    }
  } catch (error) {
    console.error('上传失败:', error);
    proxy?.$modal.msgError('上传失败');
    proxy?.$modal.closeLoading();
  }
};

3. 新增文档

  • 文件路径: docs/开发文档/图片上传组件安全改造说明.md
  • 文档内容: 详细的使用说明、迁移指南、测试建议

🔄 兼容性说明

向后兼容

  • ✅ 不启用密码验证时,组件行为与原来完全一致
  • ✅ 原有的所有props参数继续支持
  • ✅ 文件上传、预览、删除功能正常工作

新功能可选

  • ✅ 密码验证功能默认关闭
  • ✅ 需要时可通过props启用
  • ✅ 支持动态密码输入

🧪 测试验证

功能测试

  • 基础文件上传功能正常
  • 密码验证功能正常
  • 密码错误时提示正确
  • 预览功能正常
  • 删除功能正常

安全测试

  • 无密码时无法上传(启用密码验证时)
  • 错误密码时无法上传
  • 密码验证失败时提示正确
  • 密码不会在控制台泄露

兼容性测试

  • 不启用密码验证时功能正常
  • 原有页面无需修改即可使用
  • 文件格式限制正常
  • 文件大小限制正常

📝 使用示例

基础用法(不启用密码验证)

<ImageUpload 
  v-model="imageList"
  :limit="5"
  :file-size="10"
  :file-type="['png', 'jpg', 'jpeg']"
/>

启用密码验证

<ImageUpload 
  v-model="imageList"
  :limit="5"
  :file-size="10"
  :file-type="['png', 'jpg', 'jpeg']"
  :enable-password-validation="true"
  :bucket-password="bucketPassword"
/>

动态密码验证

<ImageUpload 
  v-model="imageList"
  :limit="5"
  :file-size="10"
  :file-type="['png', 'jpg', 'jpeg']"
  :enable-password-validation="true"
/>

⚠️ 注意事项

1. 后端要求

  • 上传接口需要支持 bucket-password 请求头
  • 需要验证bucket密码的有效性
  • 返回标准的响应格式

2. 安全建议

  • 使用强密码并定期更换
  • 不要在代码中硬编码密码
  • 建议使用环境变量或配置中心管理密码

3. 部署建议

  • 先在后端实现bucket密码验证功能
  • 测试密码验证接口正常后再启用前端功能
  • 建议在测试环境充分验证后再部署到生产环境

🔗 相关文档

📊 变更统计

  • 修改文件: 1个
  • 新增文档: 1个
  • 新增功能: 4个主要功能
  • 代码行数: +150行(新增)
  • 向后兼容: 100%兼容

变更人: AI助手
审核人: 待审核
状态: 已完成