【发布时间】:2021-03-17 13:41:42
【问题描述】:
我正在尝试在我的 Expo 应用程序上使用 Axios 将图像和一些数据上传到我的 API。代码如下:
// api.ts
import axios from 'axios'
const api = axios.create({
baseURL: 'http://999.999.999.999/api', // <-- my cloud server ip
responseType: 'json'
})
export default api
// register.ts
import FormData from 'form-data' // https://www.npmjs.com/package/form-data
import api from '../services/api'
const options = { headers: 'Content-Type': 'multipart/form-data' } }
export const register = async (formData: FormData): Promise<boolean> => {
try {
const response = api.post<{ error: boolean, data: string }>(
'/authentication/register',
formData,
options
)
return Boolean(response.data?.data)
} catch (error) {
return false
}
}
我也在使用expo-image-picker 并将结果附加到FormData:
const result = await ImagePicker.launchCameraAsync({})
if (result.cancelled) {
return
}
const personalPhotoUriParts = result.uri.split('.')
const personalPhotoFileType = personalPhotoUriParts[personalPhotoUriParts.length - 1]
const formData = new FormData()
formData.append('email', 'teste@mail.com')
formData.appent('password', '123456')
formData.append('personal_photo', {
uri: result.uri,
name: `personal_photo.${personalPhotoFileType}`,
type: `image/${personalPhotoFileType}`
})
register(formData) // from register.ts
所有的东西都在模拟器上按预期工作,从我得到的 PHP API 正文内容发送和打印:
// var_dump($_POST);
Array [
"email": "test@mail.com",
"password": "123456"
]
// var_dump($_FILES)
Object {
"personal_photo": Object {
"error": 0,
"name": "document_photo.jpg",
"size": 135327,
"tmp_name": "/tmp/php5o11qT",
"type": "image/jpg",
}
}
但是当我尝试从物理设备发送它时,两种情况下我都得到一个空的正文:
// var_dump($_POST);
Array []
// var_dump(get_file_contents('php://input'));
// nothing
// var_dump($_FILES);
Array []
我赌FormData,我使用其他API 路由没有问题(在物理设备上),但是当我不得不使用multipart/form-data 时,我遇到了这个问题。对我来说,这没有任何意义,因为相同的 API 可以在模拟器上与 React JS (WEB)、Postman 和 RN w/ Expo 一起使用。
【问题讨论】:
-
您是否尝试将 URL 更改为 https 只是为了查看?您是否在任何地方都没有看到任何错误,即帖子正在完成但没有返回数据?您能否确认云服务器已收到 POST 并且只是响应被客户端误解了?还是您认为请求没有成功?
-
发出了请求,如果我检查网络,我可以看到所有数据都发送到服务器,但是在服务器上,打印所有可能的输入什么都没有显示。我现在不能使用 HTTPS,因为我还没有域名提供商。但我怀疑这是原因,我会收到网络错误(没有提示错误,服务器返回 200 状态)。
-
我正在考虑获取base64然后解码到服务器上的文件,我已经尝试弹出(expo sdk 40),但没有成功。
标签: react-native axios expo multipartform-data form-data