Image Upload in React Native | Expo App

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
Let’s consider how to implement image upload in a  react native or expo app using expo-image-picker. The goal here is to upload and display an image   from the user’s gallery or take a new  image with the camera when the image   button is pressed. As well as provide  a way to delete the uploaded picture. We’ll also talk briefly about how to  proceed with the uploaded image for   storage by making API calls and also when  you have other input fields using FormData. In this tutorial, I will demonstrate using  this sample app with the profile page here.   The aim will only be on the functionality  so we’ll not be building the UI. However,   the source code will be linked in the description. So what will you need? First, you need to install  expo-image-picker in your project. In addition to that, you need to have an image  component on your page. This should be given   at least a height and a width, and you can  add any additional styling of your choice. Next, you need a button to trigger the  upload and this can be a touchable opacity. If you want to provide the  multiple options of upload,   you need a page or a modal with buttons for  camera, gallery and removing the uploaded image. Finally you’ll need a placeholder image to  be used when no image has been uploaded. Once we have that we are ready to go. The upload process starts with pressing the button  on the profile page. When the button is pressed,   we want to display the options of upload. So in the onPress property of our button,   we display the modal with the options or navigate   to the screen with the options if  we’re using a full page instead. Now on the options modal screen, the  first option is to use the camera. For this, let’s create an async  function, and we’ll call it uploadImage. For the work here, we need to import  the ImagePicker we installed earlier. To start, we await a request for  permission to access the user’s camera,   using the permission method of the ImagePicker. Next, we create a result variable and as value,   we await the result of launching the  camera with the ImagePicker method. To this method, we can pass an object of  arguments. First we pass a cameraType. Since   we’re working with a profile picture,  we can default to the front camera.  Also, we allow editing so that we can  crop, set the aspect ratio to 1:1 and   then set the quality to the highest. You  can alter these values to suit your needs. However, on IOS, the aspect ratio is limited to  being a square regardless of the values passed. Now based on the result received,   we check if the upload was not canceled.  If that's the case, we want to save it. For this, we create a new state for  the image using the useState hook   from react. With that done, we create a  new async function for saving the image. This will accept the image as  a parameter and set it as the   value of the image state. After this,  the options modal can be dismissed. Now we call the save function after  uploading and pass the image uri which   can be located in the first element  of the assets array under the result. If we catch any error, we can alert  the message and dismiss the modal.   We then pass the uploadImage function to the  onPress property of the camera option button. Next, to display the uploaded image, we need  to pass the image state to the image component. Here, my image component  is in the avatar component,   so I’ll pass it through the uri property. In my Avatar component, once  I have access to the URI,   I pass it as an object to the source  property of the image component. Now if we don’t have any image uploaded,  we want to display our placeholder image.   So we can import that from our assets.  Over here, we check if we have a value   for uri. If that's true, we pass the uri  object. Otherwise we pass the placeholder. With this done, we should be able to upload  and display an image using the camera option. Now for the gallery option, let  modify the uploadImage function. First, let’s accept a mode parameter. Now we check if the mode is gallery.  If that’s the case we want to await   the ImagePicker permission. This time  around, it will be for the media library. After this, we launch the image  library with the image picker. Here,   we set the media types to  only images, allow editing,   set the aspect ratio to a square and  enable the highest image quality as well. With this done, we want to store the result in  the result variable as well. So we initialize a   global result variable to an empty object, and  assign the gallery and camera results to it. Now we need to pass this function to  the gallery option button of the modal. So over here, we call uploadImage  and pass gallery as the mode. With this done, we should be able to upload  and display an image from the gallery as well. Now let’s handle how to  remove the uploaded picture. For this, let’s create an async  function and call it removeImage. Over here, we call the saveImage  function and pass null as the value.  In the case of an error, we can alert the  message and hide the modal. We can then   pass the function to the onPress  property of the option button. With this done, we should be able to  remove the uploaded image as well. Now a few tips on how to proceed with  the uploaded image. Let’s talk about   when you have only the image and when  you have other form inputs as well. When you have only the image, usually, you’ll make   an api call right after uploading  the image to store it in a database. So in the saveImage function, right  after updating the image state,   we make a call to the backend api. Here  we can do so in a dedicated function. For processing the image data, we need  to use the global FormData interface,   which can be declared at the top. Now for the request, we create a new  instance of the form data and append   the image. Giving it a key and an object  as value. This will contain the image uri,   which will be the image state, the type of  data, which is image and a name for the file. Demonstrating with the Axios API Client,  we also need a config object which contains   headers for the request. In this, we set  the content type as multipart or form-data.   We also add a transformRequest  function and return the formData. With this done, we can make  the request with Axios,   passing the endpoint, formData  and the configuration object. When you remove the uploaded image as well,   this will apply and make the api call  since it also uses the saveImage function. In the situation where you have the image  and other form inputs to be processed,   the approach will be quite similar. However, right after uploading the image,   we only update the image state and  not make the API call to the backend. Similarly, when the uploaded image is removed,   we only update the image state and  hide the modal, making no api request. When the other details are provided, we  then proceed with a submit button which   will call a save function to make the API call. Just like the initial one, we  create a new formData instance   and append all the other input data  in addition to the image. We’ll have   the same config and then we can proceed  to make the api call to save the data. Now back on the profile page, when you  want to fetch the details from the API,   you can do so in the useEffect hook to get  all the details before the page is ready. In the next video, we’ll look  at how to persist and share data   across multiple parts of your app  using secure store and context API. Link to the source code will be in  the description. Thanks for watching.
Info
Channel: ToThePointCode
Views: 21,148
Rating: undefined out of 5
Keywords: tothepointcode
Id: uX5E_QFJubU
Channel Id: undefined
Length: 9min 24sec (564 seconds)
Published: Wed Oct 11 2023
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.