You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular表单上传文件后PHP端无法获取$_FILES及文件信息如何解决?

问题解决方法

问题根因

你当前将文件转换为base64格式的DataURL,随JSON格式的请求体提交,PHP的$_FILES全局仅支持识别multipart/form-data编码的二进制文件提交,因此无法读取文件信息;同时你未单独提交文件名、大小等元数据,后端也无法直接解析获取。

调整方案

1. 前端Angular代码修改

1.1 调整文件选择逻辑

无需将文件转base64,直接保存原始File对象即可:

// 组件内声明变量存储选中的文件
selectedFile: File = null;

cambioFile1(event) {
  if(event.target.files && event.target.files.length) {
    // 保存原始文件对象
    this.selectedFile = event.target.files[0];
    // 可按需在FormGroup中存储文件名用于前端展示/校验
    this.formaA.patchValue({
      Fichier1: this.selectedFile.name
    });
  }
}

1.2 调整请求提交逻辑

使用FormData包装所有表单数据和文件,浏览器会自动使用multipart/form-data编码提交:

// 构建FormData实例
const formData = new FormData();
// 批量插入普通表单字段
Object.keys(this.formaA.value).forEach(key => {
  formData.append(key, this.formaA.value[key]);
});
// 插入上传文件,附带原始文件名
if (this.selectedFile) {
  formData.append('Fichier1', this.selectedFile, this.selectedFile.name);
}

// 提交请求,原有回调逻辑保持不变
this.frmOriDir.registrarActuacion(formData)
.subscribe( e => {
  if(e['status'] === 500){
    this.toastr.error(e['mensaje'], 'Atención ', {
      timeOut: 5000,
    });
    this.loading = false;

  }else if(e['status'] === 200){
      this.toastr.success(e['mensaje'], 'Proceso Exitoso ', { 
        timeOut: 5000,
        enableHtml: true,
        progressBar:true,
        closeButton: true,
      }
    );
  }
});

1.3 接口请求逻辑调整

无需手动设置Content-Type请求头,浏览器会自动生成带边界标识的正确编码头:

registrarActuacion(datos){ 
    const url = `UrlExample`;
    return this.http.post<any>( url, datos);
}

2. 后端PHP代码修改

直接通过$_POST读取普通表单字段,$_FILES读取上传文件信息:

// 读取普通表单参数
print_r($_POST);
// 读取文件元信息
print_r($_FILES['Fichier1']);

// 示例文件处理逻辑
if ($_FILES['Fichier1']['error'] === UPLOAD_ERR_OK) {
    $fileName = $_FILES['Fichier1']['name']; // 原始文件名
    $fileSize = $_FILES['Fichier1']['size']; // 文件大小(字节)
    $fileTmpPath = $_FILES['Fichier1']['tmp_name']; // 服务端临时文件路径
    // 移动文件到自定义存储目录
    move_uploaded_file($fileTmpPath, './自定义存储目录/' . $fileName);
}

可选兼容方案(不推荐)

如果需要保留原有base64提交逻辑,可在前端提交时额外传递文件名、大小字段,后端接收后解码base64内容生成文件:

  • 前端提交时新增字段Fichier1Name、Fichier1Size,传入对应值
  • 后端从php://input读取base64内容,去掉前缀后用base64_decode()解码写入文件即可
    该方案会使传输体积增加约33%,不适合大文件上传场景

内容的提问来源于stack exchange,提问作者andres castellanos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 01:54:02