I’m making a mobile application using expo client to allow user to upload image or take from a camera and then the image saves on my local server on PHP / Database MySQL. How do I do that thing if I’m using an expo?
for example code in react native (saving to PHP local server but not save database)
import React, { Component } from 'react'; import { ActivityIndicator, Button, Clipboard, Image, Share, StatusBar, StyleSheet, Text, TouchableOpacity, View, } from 'react-native'; import { Constants } from 'expo'; import * as ImagePicker from 'expo-image-picker'; import * as Permissions from 'expo-permissions'; export default class App extends Component { state = { image: null, uploading: false, }; render() { let { image } = this.state; return ( <View style={styles.container}> <StatusBar barStyle="default" /> <Text style={styles.exampleText}> Example: Upload ImagePicker result </Text> <Button onPress={this._pickImage} title="Pick an image from gallery" /> <Button onPress={this._takePhoto} title="Take a photo" /> {this._maybeRenderImage()} {this._maybeRenderUploadingOverlay()} </View> ); } _maybeRenderUploadingOverlay = () => { if (this.state.uploading) { return ( <View style={[StyleSheet.absoluteFill, styles.maybeRenderUploading]}> <ActivityIndicator color="#fff" size="large" /> </View> ); } }; _maybeRenderImage = () => { let { image } = this.state; if (!image) { return; } return ( <View style={styles.maybeRenderContainer}> <View style={styles.maybeRenderImageContainer}> <Image source={{ uri: image }} style={styles.maybeRenderImage} /> </View> <Text onPress={this._copyToClipboard} onLongPress={this._share} style={styles.maybeRenderImageText}> {image} </Text> </View> ); }; _share = () => { Share.share({ message: this.state.image, title: 'Check out this photo', url: this.state.image, }); }; _copyToClipboard = () => { Clipboard.setString(this.state.image); alert('Copied image URL to clipboard'); }; _takePhoto = async () => { const { status: cameraPerm } = await Permissions.askAsync(Permissions.CAMERA); const { status: cameraRollPerm } = await Permissions.askAsync(Permissions.CAMERA_ROLL); // only if user allows permission to camera AND camera roll if (cameraPerm === 'granted' && cameraRollPerm === 'granted') { let pickerResult = await ImagePicker.launchCameraAsync({ allowsEditing: true, aspect: [4, 3], }); this._handleImagePicked(pickerResult); } }; _pickImage = async () => { const { status: cameraRollPerm } = await Permissions.askAsync(Permissions.CAMERA_ROLL); // only if user allows permission to camera roll if (cameraRollPerm === 'granted') { let pickerResult = await ImagePicker.launchImageLibraryAsync({ allowsEditing: true, aspect: [4, 3], }); this._handleImagePicked(pickerResult); } }; _handleImagePicked = async pickerResult => { let uploadResponse, uploadResult; try { this.setState({ uploading: true }); if (!pickerResult.cancelled) { uploadResponse = await uploadImageAsync(pickerResult.uri); uploadResult = await uploadResponse.json(); this.setState({ image: uploadResult.location }); } } catch (e) { console.log({ uploadResponse }); console.log({ uploadResult }); console.log({ e }); alert('Upload failed, sorry :('); } finally { this.setState({ uploading: false }); } }; } async function uploadImageAsync(uri) { let apiUrl = 'http://192.168.0.18/upload-api/uploading.php'; let uriParts = uri.split('.'); let fileType = uriParts[uriParts.length - 1]; let formData = new FormData(); formData.append('fileToUpload', { uri, name: `fileToUpload.${fileType}`, type: `image/${fileType}`, }); let options = { method: 'POST', body: formData, headers: { Accept: 'application/json', 'Content-Type': 'multipart/form-data', }, }; return fetch(apiUrl, options); }
and here is my PHP
<?php $target_dir = 'uploads/'; $target_file = $target_dir . basename($_FILES['fileToUpload']['name']); $status = array(); if (move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $target_file)) { $status['status']=1; $status['description']='upload success'; } else { $status['status']=0; $status['description']='upload failed'; } echo json_encode($status); ?>
Any solution to this? thank you
Advertisement
Answer
You can use Fetch Api to upload image
var photo = { uri: selectImg.localUri, type: 'image/jpeg', name: 'photo.jpg', }; var form = new FormData(); form.append("ProfilePicture", photo); fetch( Constants.API_USER + 'me/profilePicture', { body: form, method: "PUT", headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'Bearer ' + user.token } } ).then((response) => response.json()) .catch((error) => { alert("ERROR " + error) }) .then((responseData) => { alert("Succes "+ responseData) }).done();