ESP32 Cam拍摄照片上传至PHP网站问题求助
解决ESP32 Cam图片上传PHP网站问题
原代码核心问题
- 用
json参数上传二进制图片是错误的,JSON无法直接传输二进制数据,必须使用multipart/form-data表单格式 - WiFi连接逻辑未等待连接成功就继续执行,可能导致后续网络请求失败
- 多余的本地文件读写操作,直接使用摄像头捕获的字节缓冲区即可完成上传,无需写入本地再读取
修正后的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
相关产品推荐
相关产品推荐

