如何在 React Native 中通过上传图片获取数据到 php 服务器
How to fetch data with upload image to php server in React Native
我有一个 React Native 项目,它从文本输入中接收名称、电子邮件、phone 号码,然后将这些数据插入到 php 服务器 throw fetch api 并且它工作正常,但我需要让用户能够上传图片,当点击保存按钮时,所有数据(姓名、电子邮件、phone 号码、照片)保存到 php 服务器抛出 api,现在我使用
"react-native-image-picker" 并且工作正常,但我不知道如何使用表单数据上传带有数据抛出的图像 api。
这是本机反应代码:
import React, { Component } from 'react';
import {View,Text,StyleSheet,TextInput,TouchableOpacity,Image} from 'react-native';
import ViewDataUsers from './ViewDataUsers';
import ImagePicker from 'react-native-image-picker';
const options={
title:'select a photo',
takePhotoButtonTitle:'Take a Photo',
chooseFrmoLibraryButtonTitle:'Choose from Gallery',
quality:1
};
class InputUsers extends Component{
//constructor have a state that conatains the properties that will recieve the values from Text Inputes
constructor(props){
super(props)
this.state = {
TextInputName:'',
TextInputEmail:'',
TextInputPhoneNumber:'',
iamgeSource: null,
}
}
selectPhoto(){
ImagePicker.showImagePicker(options, (response) => {
console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled image picker');
}
else if (response.error) {
console.log('ImagePicker Error: ', response.error);
}
else {
let source = { uri: response.uri };
this.setState({
iamgeSource: source
});
}
});
}
//arrow function that will fire when press on save button to save data in database via API
InsertUser = ()=>{
//constant varaibles that equal propertes in state
const {TextInputName} = this.state;
const {TextInputEmail} = this.state;
const {TextInputPhoneNumber} = this.state;
//API that use fetch to input data to database via backend php script
fetch('http://192.168.1.7/tr_reactnative/insert.php',{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name : TextInputName,
email: TextInputEmail,
phone_number : TextInputPhoneNumber,
})
})
.then((response) => response.json())
.then((responseJson) => {
// return responseJson
alert(responseJson);
this.props.navigation.navigate('seconde');
})
.catch((error) => {
console.error(error);
});
//alert('Pressed!!');
}
ViewUsersList = ()=>{
this.props.navigation.navigate('seconde');
}
render(){
return(
<View style ={styles.container}>
<TextInput
// value = {this.TextInputName}
placeholder = 'Enter Name'
onChangeText = {TextInputValue=>this.setState({TextInputName:TextInputValue}) }
underlineColorAndroid = 'transparent'
style = {styles.TextInputStyle}
/>
<TextInput
//value = {this.TextInputEmail}
placeholder = 'Enter E-mail'
onChangeText = {TextInputValue=>this.setState({TextInputEmail:TextInputValue}) }
underlineColorAndroid = 'transparent'
style = {styles.TextInputStyle2}
/>
<TextInput
//value = {this.TextInputPhoneNumber}
placeholder = 'Enter Phone Number'
onChangeText = {TextInputValue=>this.setState({TextInputPhoneNumber:TextInputValue}) }
underlineColorAndroid = 'transparent'
style = {styles.TextInputStyle2}
/>
<Image style={styles.image}
source={this.state.iamgeSource != null ? this.state.iamgeSource : require('./image/not_avilable.jpg')}
/>
<TouchableOpacity style = {styles.TouchableOpacityStyle} onPress={this.selectPhoto.bind(this)}>
<Text style = {styles.TextStyle}>Select Photo</Text>
</TouchableOpacity>
<TouchableOpacity activeOpacity = {.4} style = {styles.TouchableOpacityStyle} onPress={this.InsertUser}>
<Text style = {styles.TextStyle}>Save</Text>
</TouchableOpacity>
<TouchableOpacity activeOpacity = {.4} style = {styles.TouchableOpacityStyle} onPress={this.ViewUsersList}>
<Text style = {styles.TextStyle}>View Users</Text>
</TouchableOpacity>
</View>
)
}
}
const styles = StyleSheet.create ({
container : {
alignItems:'center',
flex:1,
marginTop:5,
backgroundColor:'#fff'
},
TextInputStyle :{
textAlign:'center',
marginBottom:7,
width:'90%',
height:40,
borderWidth:1,
borderRadius:5,
borderColor:'#FF5722'
},
TextInputStyle2 :{
textAlign:'center',
marginBottom:7,
marginTop:20,
width:'90%',
height:40,
borderWidth:1,
borderRadius:5,
borderColor:'#FF5722'
},
TextStyle : {
color:'#fff',
textAlign:'center'
},
TouchableOpacityStyle:{
paddingTop:10,
paddingBottom:10,
marginTop:20,
borderRadius:5,
marginBottom:7,
width:'90%',
backgroundColor:'#00BCD4'
},
button:{
width:250,
height:50,
backgroundColor:"#330066"
},
text:{
color:'white',
fontSize:30,
textAlign:'center'
},
image:{
width:200,
height:200,
marginTop:30
}
});
export default InputUsers;
这是 php 脚本:
<?php
include 'connections.php';
$json = file_get_contents('php://input');
$obj = json_decode($json, true);
$name = $obj['name'];
$email = $obj['email'];
$phone_number = $obj['phone_number'];
if(mysqli_query($link, "INSERT INTO users(name,email, phone_number)VALUES('$name','$email','$phone_number')")){
echo json_encode('Inserted succesfully');
}else{
echo json_encode('insert faild');
}
mysqli_close($link);
我需要将所有数据从应用程序发送到 php 服务器,包括用户在点击保存按钮时上传的图像,有帮助吗?
要上传您的照片,您必须使用 Formdata
InsertUser = ()=>{
//constant variables that equal properties in state
const {TextInputName} = this.state;
const {TextInputEmail} = this.state;
const {TextInputPhoneNumber} = this.state;
const {iamgeSource} = this.state;
const formData = new FormData();
//Add your input data
formData.append('name', TextInputName);
formData.append('email', TextInputEmail);
formData.append('phone_number', TextInputPhoneNumber);
//Add your photo
//this, retrive the file extension of your photo
const uriPart = iamgeSource.split('.');
const fileExtension = uriPart[uriPart.length - 1];
formData.append('photo', {
uri: iamgeSource,
name: `photo.${fileExtension}`,
type: `image/${fileExtension}`
});
//API that use fetch to input data to database via backend php script
fetch('http://192.168.1.7/tr_reactnative/insert.php',{
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: formData
})
.then((response) => response.json())
.then((responseJson) => {
// return responseJson
alert(responseJson);
this.props.navigation.navigate('seconde');
})
.catch((error) => {
console.error(error);
});
//alert('Pressed!!');
}
您会找到更多信息here。
我有一个 React Native 项目,它从文本输入中接收名称、电子邮件、phone 号码,然后将这些数据插入到 php 服务器 throw fetch api 并且它工作正常,但我需要让用户能够上传图片,当点击保存按钮时,所有数据(姓名、电子邮件、phone 号码、照片)保存到 php 服务器抛出 api,现在我使用 "react-native-image-picker" 并且工作正常,但我不知道如何使用表单数据上传带有数据抛出的图像 api。
这是本机反应代码:
import React, { Component } from 'react';
import {View,Text,StyleSheet,TextInput,TouchableOpacity,Image} from 'react-native';
import ViewDataUsers from './ViewDataUsers';
import ImagePicker from 'react-native-image-picker';
const options={
title:'select a photo',
takePhotoButtonTitle:'Take a Photo',
chooseFrmoLibraryButtonTitle:'Choose from Gallery',
quality:1
};
class InputUsers extends Component{
//constructor have a state that conatains the properties that will recieve the values from Text Inputes
constructor(props){
super(props)
this.state = {
TextInputName:'',
TextInputEmail:'',
TextInputPhoneNumber:'',
iamgeSource: null,
}
}
selectPhoto(){
ImagePicker.showImagePicker(options, (response) => {
console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled image picker');
}
else if (response.error) {
console.log('ImagePicker Error: ', response.error);
}
else {
let source = { uri: response.uri };
this.setState({
iamgeSource: source
});
}
});
}
//arrow function that will fire when press on save button to save data in database via API
InsertUser = ()=>{
//constant varaibles that equal propertes in state
const {TextInputName} = this.state;
const {TextInputEmail} = this.state;
const {TextInputPhoneNumber} = this.state;
//API that use fetch to input data to database via backend php script
fetch('http://192.168.1.7/tr_reactnative/insert.php',{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name : TextInputName,
email: TextInputEmail,
phone_number : TextInputPhoneNumber,
})
})
.then((response) => response.json())
.then((responseJson) => {
// return responseJson
alert(responseJson);
this.props.navigation.navigate('seconde');
})
.catch((error) => {
console.error(error);
});
//alert('Pressed!!');
}
ViewUsersList = ()=>{
this.props.navigation.navigate('seconde');
}
render(){
return(
<View style ={styles.container}>
<TextInput
// value = {this.TextInputName}
placeholder = 'Enter Name'
onChangeText = {TextInputValue=>this.setState({TextInputName:TextInputValue}) }
underlineColorAndroid = 'transparent'
style = {styles.TextInputStyle}
/>
<TextInput
//value = {this.TextInputEmail}
placeholder = 'Enter E-mail'
onChangeText = {TextInputValue=>this.setState({TextInputEmail:TextInputValue}) }
underlineColorAndroid = 'transparent'
style = {styles.TextInputStyle2}
/>
<TextInput
//value = {this.TextInputPhoneNumber}
placeholder = 'Enter Phone Number'
onChangeText = {TextInputValue=>this.setState({TextInputPhoneNumber:TextInputValue}) }
underlineColorAndroid = 'transparent'
style = {styles.TextInputStyle2}
/>
<Image style={styles.image}
source={this.state.iamgeSource != null ? this.state.iamgeSource : require('./image/not_avilable.jpg')}
/>
<TouchableOpacity style = {styles.TouchableOpacityStyle} onPress={this.selectPhoto.bind(this)}>
<Text style = {styles.TextStyle}>Select Photo</Text>
</TouchableOpacity>
<TouchableOpacity activeOpacity = {.4} style = {styles.TouchableOpacityStyle} onPress={this.InsertUser}>
<Text style = {styles.TextStyle}>Save</Text>
</TouchableOpacity>
<TouchableOpacity activeOpacity = {.4} style = {styles.TouchableOpacityStyle} onPress={this.ViewUsersList}>
<Text style = {styles.TextStyle}>View Users</Text>
</TouchableOpacity>
</View>
)
}
}
const styles = StyleSheet.create ({
container : {
alignItems:'center',
flex:1,
marginTop:5,
backgroundColor:'#fff'
},
TextInputStyle :{
textAlign:'center',
marginBottom:7,
width:'90%',
height:40,
borderWidth:1,
borderRadius:5,
borderColor:'#FF5722'
},
TextInputStyle2 :{
textAlign:'center',
marginBottom:7,
marginTop:20,
width:'90%',
height:40,
borderWidth:1,
borderRadius:5,
borderColor:'#FF5722'
},
TextStyle : {
color:'#fff',
textAlign:'center'
},
TouchableOpacityStyle:{
paddingTop:10,
paddingBottom:10,
marginTop:20,
borderRadius:5,
marginBottom:7,
width:'90%',
backgroundColor:'#00BCD4'
},
button:{
width:250,
height:50,
backgroundColor:"#330066"
},
text:{
color:'white',
fontSize:30,
textAlign:'center'
},
image:{
width:200,
height:200,
marginTop:30
}
});
export default InputUsers;
这是 php 脚本:
<?php
include 'connections.php';
$json = file_get_contents('php://input');
$obj = json_decode($json, true);
$name = $obj['name'];
$email = $obj['email'];
$phone_number = $obj['phone_number'];
if(mysqli_query($link, "INSERT INTO users(name,email, phone_number)VALUES('$name','$email','$phone_number')")){
echo json_encode('Inserted succesfully');
}else{
echo json_encode('insert faild');
}
mysqli_close($link);
我需要将所有数据从应用程序发送到 php 服务器,包括用户在点击保存按钮时上传的图像,有帮助吗?
要上传您的照片,您必须使用 Formdata
InsertUser = ()=>{
//constant variables that equal properties in state
const {TextInputName} = this.state;
const {TextInputEmail} = this.state;
const {TextInputPhoneNumber} = this.state;
const {iamgeSource} = this.state;
const formData = new FormData();
//Add your input data
formData.append('name', TextInputName);
formData.append('email', TextInputEmail);
formData.append('phone_number', TextInputPhoneNumber);
//Add your photo
//this, retrive the file extension of your photo
const uriPart = iamgeSource.split('.');
const fileExtension = uriPart[uriPart.length - 1];
formData.append('photo', {
uri: iamgeSource,
name: `photo.${fileExtension}`,
type: `image/${fileExtension}`
});
//API that use fetch to input data to database via backend php script
fetch('http://192.168.1.7/tr_reactnative/insert.php',{
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: formData
})
.then((response) => response.json())
.then((responseJson) => {
// return responseJson
alert(responseJson);
this.props.navigation.navigate('seconde');
})
.catch((error) => {
console.error(error);
});
//alert('Pressed!!');
}
您会找到更多信息here。