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

ESP32 Cam拍摄照片上传至PHP网站问题求助

解决ESP32 Cam图片上传PHP网站问题

原代码核心问题

  1. 用json参数上传二进制图片是错误的,JSON无法直接传输二进制数据,必须使用multipart/form-data表单格式
  2. WiFi连接逻辑未等待连接成功就继续执行,可能导致后续网络请求失败
  3. 多余的本地文件读写操作,直接使用摄像头捕获的字节缓冲区即可完成上传,无需写入本地再读取

修正后的ESP32 MicroPython代码

import urequests
import camera
from machine import Pin
import network
import machine
import time
import gc

# 设置CPU频率
machine.freq(240000000)

# WiFi连接逻辑优化
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)

if not sta_if.isconnected():
    print('正在连接WiFi...')
    sta_if.connect('dlink-M961-2.4G-a176', 'skmfu47667')
    # 最多等待10秒连接
    timeout = 10
    while not sta_if.isconnected() and timeout > 0:
        time.sleep(1)
        timeout -= 1
    if not sta_if.isconnected():
        print('WiFi连接失败,即将重启')
        machine.reset()
print('WiFi已连接,IP:', sta_if.ifconfig()[0])

gc.collect()

# 初始化摄像头
flash = Pin(4, Pin.OUT)
flash.value(1)
time.sleep(0.5)

camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM)
camera.quality(12)
camera.framesize(9)  # QVGA分辨率

# 捕获图片
buf = camera.capture()
flash.value(0)

gc.collect()

# 构建multipart/form-data格式的上传数据
boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW'
data = (
    f'--{boundary}\r\n'
    f'Content-Disposition: form-data; name="photo"; filename="esp32.jpg"\r\n'
    f'Content-Type: image/jpeg\r\n\r\n'
    + buf
    + f'\r\n--{boundary}--\r\n'
)

headers = {
    'Content-Type': f'multipart/form-data; boundary={boundary}'
}

# 发送上传请求
try:
    response = urequests.post('https://x.x.net/python/image.php', data=data, headers=headers)
    print('上传响应:', response.text)
    response.close()
except Exception as e:
    print('上传失败:', str(e))

# 释放摄像头资源
camera.deinit()

PHP后端处理代码(image.php)

<?php
// 允许的图片类型
$allowed_types = ['image/jpeg', 'image/jpg'];
// 上传文件存储目录(确保该目录有写入权限)
$upload_dir = './uploads/';

// 检查是否有文件上传
if (isset($_FILES['photo'])) {
    $file = $_FILES['photo'];
    
    // 检查上传错误
    if ($file['error'] !== UPLOAD_ERR_OK) {
        echo '上传错误,错误码: ' . $file['error'];
        exit;
    }
    
    // 验证文件类型
    if (!in_array($file['type'], $allowed_types)) {
        echo '仅允许上传JPG/JPEG格式图片';
        exit;
    }
    
    // 创建上传目录(不存在则自动创建)
    if (!is_dir($upload_dir)) {
        mkdir($upload_dir, 0755, true);
    }
    
    // 生成唯一文件名,避免覆盖
    $filename = uniqid() . '.jpg';
    $target_path = $upload_dir . $filename;
    
    // 移动上传文件到目标目录
    if (move_uploaded_file($file['tmp_name'], $target_path)) {
        echo '上传成功,文件路径: ' . $target_path;
    } else {
        echo '文件存储失败,请检查目录权限';
    }
} else {
    echo '未检测到上传的图片文件';
}
?>

关键注意事项

  • ESP32端:必须使用multipart/form-data格式上传,这是HTTP文件上传的标准协议
  • PHP端:确保uploads目录有写入权限(可通过chmod 755 uploads命令设置)
  • 网络:确认ESP32能正常访问PHP网站的域名/IP,若使用HTTPS需确保ESP32的urequests支持SSL

内容的提问来源于stack exchange,提问作者Abdalnassir Ghzawi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:25:13