php - PHP在上传图像时从React Native接收空数据?
问题描述
我花了一段时间才弄清楚,因为在应用程序屏幕上我得到的只是JSON Parse Error: '<'
. 感谢error_log
,我在 PHP 中发现了这些错误:
[29-Jun-2018 19:35:34 America/Chicago] PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0
[29-Jun-2018 19:35:34 America/Chicago] PHP Warning: explode() expects parameter 2 to be string, array given in React/user-image-upload.php on line 17
[29-Jun-2018 19:35:34 America/Chicago] PHP Warning: end() expects parameter 1 to be array, null given in React/user-image-upload.php on line 18
[29-Jun-2018 19:35:34 America/Chicago] PHP Warning: preg_match() expects parameter 2 to be string, array given in React/user-image-upload.php on line 27
[29-Jun-2018 19:35:34 America/Chicago] PHP Warning: unlink() expects parameter 1 to be a valid path, array given in React/user-image-upload.php on line 30
这是我上传图片的 php 代码:
<?php
// Getting the received JSON into $json variable.
$json = file_get_contents('php://input');
// decoding the received JSON and store into $obj variable.
$obj = json_decode($json,true);
$fileName = $obj["userimgSource"]; // The file name
$fileTmpLoc = $obj["userimgSource"]; // File in the PHP tmp folder
$fileType = $obj["userimgSourceType"]; // The type of file it is
$fileSize = $obj["userimgSourceSize"]; // File size in bytes
$fileErrorMsg = $_FILES["uploaded_file"]["error"]; // 0 for false... and 1 for true
$kaboom = explode(".", $fileName); // Split file name into an array using the dot
$fileExt = end($kaboom); // Now target the last array element to get the file extension
// START PHP Image Upload Error Handling --------------------------------------------------
if (!$fileTmpLoc) { // if file not chosen
echo json_encode("ERROR: Please browse for a file before clicking the upload button.");
exit();
} else if($fileSize > 5242880) { // if file size is larger than 5 Megabytes
echo json_encode("ERROR: Your file was larger than 5 Megabytes in size.");
unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
exit();
} else if (!preg_match("/.(gif|jpg|jpe|jpeg|png)$/i", $fileName) ) {
// This condition is only if you wish to allow uploading of specific file types
echo json_encode("ERROR: Your image was not .gif, .jpg, .jpe, or .png.");
unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
exit();
}
// END PHP Image Upload Error Handling ----------------------------------------------------
// Place it into your "uploads" folder mow using the move_uploaded_file() function
$moveResult = move_uploaded_file($fileTmpLoc, "../profiles/uploads/$fileName");
// Check to make sure the move result is true before continuing
if ($moveResult != true) {
echo json_encode("ERROR: File not uploaded. Try again.");
unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
exit();
}
if ($moveResult == true) {
$db = mysqli_connect("localhost", "root", "password", "photos");
$sql = "INSERT INTO user_images (images,date) VALUES ('$fileName',CURDATE())";
mysqli_query($db, $sql);
echo json_encode("Success: File uploaded.");
}
unlink($fileTmpLoc); // Remove the uploaded file from the PHP temp folder
?>
在向您展示我所有的 react native 代码之前,我只想说我对 RN 中的图像上传很陌生。我阅读了许多关于 SO 的问题以了解如何操作并观看了一些 youtube 视频。我不知道我是否应该使用base64
(如果有人可以向我解释那会很棒),据我所知,我只是拉图像路径、图像大小和图像类型,然后将该图像路径插入到我的文件夹和数据库:
SelectPhoto = () =>{
ImagePicker.openPicker({
cropping: true,
title: 'Select an image',
isCamera: true,
}).then((imgResponse) => {
console.log(imgResponse);
let imgSource = { uri: imgResponse[0].path.replace(/^.*[\\\/]/, '') };
this.setState({
userimgSource: imgSource,
userimgSourceType: imgResponse[0].mime,
userimgSourceSize: imgResponse[0].size,
});
});
}
UploadPhoto = () =>{
fetch('https://www.example.com/React/user-image-upload.php', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
userimgSource : this.state.userimgSource,
userimgSourceType: this.state.userimgSourceType,
userimgSourceSize: this.state.userimgSourceSize,
})
}).then((response) => response.json())
.then((responseJson) => {
// Showing response message coming from server after inserting records.
Alert.alert(responseJson);
}).catch((error) => {
console.error(error);
});
}
这就是混淆的地方。事实上,当我console.log
我userimgSource: imgSource, userimgSourceType: imgResponse[0].mime, userimgSourceSize: imgResponse[0].size,
的时候,我确实得到了正确的数据。我得到了图像路径:IMG_2018629.png
、mime:image/png
和大小:2,097,152
。PHP 无法从 React Native 中提供的数据中获取数据是否有原因?
解决方案
将您的标题更改为此
headers: {
'Accept': '*',
'Content-Type': 'multipart/form-data',
}
当您上传图片时,其内容类型不能是“application/json”。
Accept request-header 字段可用于指定响应可接受的某些媒体类型。因此,添加星号将使您的请求接受任何类型的响应。
推荐阅读
- javascript - 使用 mapbox-gl-js 为特征集合中的每个特征添加自定义图标
- javascript - 如何生成文本框,然后将它们的值 ng 建模为 AngularJS 中的表达式?
- javascript - 背景颜色不会改变javascript
- android-studio - LintError 未知问题 ID“StyleCycle”
- bootstrap-4 - 水平引导 4 列
- java - 在Java中制作jar文件时如何获取文件路径
- python - PySpark - 获取计数并加入到原始状态
- java - 从类路径和 .jar 加载文件
- bash - 如何在 shell 脚本的 while 循环中使用 if-else 语句?
- c# - C# 使用 NPOI 库更改单元格的背景颜色