Quantcast
Channel: Active questions tagged react-native+typescript - Stack Overflow
Viewing all articles
Browse latest Browse all 6290

React Native (expo-image-picker) image upload to backend does not work

$
0
0

I'm trying to upload an image to NestJs backend(backend uses multer) from React Native Frontend(Redux), using axios but it doesn't work and there are no logs from backend. I have tried formData.append but the request doesn't seem to reach the backend at all.

I know it's a lot of code but I'm racing against a deadline. Please help

Image Picker (expo-image-picker)

const pickImage = async () => {    try {      let result = await ImagePicker.launchImageLibraryAsync({        mediaTypes: ImagePicker.MediaTypeOptions.Images,        allowsEditing: true,        quality: 1,      });      if (!result.cancelled) {        // console.log(result?.uri);        setLocalImage(result?.uri);      } else        Alert.alert("Delete", "Are you sure you want to delete the image", [          { text: "Yes", onPress: () => setProfilePicture(null) },          { text: "No" },        ]);    } catch (error) {      console.log("error reading image", error);    }  };

handleSubmit Function (typescript)

async function handleSubmit() {    // console.log(_id, localImage, token);    let filename = localImage.split("/").pop();    let match = /\.(\w+)$/.exec(filename);    let type = match ? `image/${match[1]}` : `image`;    const ext = match?.[1];    let FData = new FormData();    FData.append("image", {      name: new Date() +"_image",      uri: localImage,      type: "image/jpg",    } as any);    if (localImage && _id && token) {      console.log("Details: ", _id, localImage, token);      dispatch(updateImageAction(_id, localImage, token) as any);    } else {      return;    }  }

user.actions.tsx (Redux action)

export const updateImageAction =  (_id: string, FData: any, token: string) => async (dispatch: Dispatch) => {    try {      dispatch({        type: UPDATE_IMAGE_REQUEST,      });      const config = {        headers: {          Accept: "application/json","Content-Type": "multipart/form-data",          authorization: `Bearer ${token}`,        },      };      const { data } = await axios.post(        routes.user.updateProfileImage + `${_id}`,        FData,        config      );      dispatch({        type: UPDATE_IMAGE_SUCCESS,        payload: data,      });    } catch (error: any) {      // console.log({ fromActionError: error });      dispatch({        type: UPDATE_IMAGE_FAIL,        payload:          error?.response && error.response?.data?.message            ? error?.response?.data?.message            : error?.message,      });    }  };

Backend Code (Controller)

@UseGuards(AccessTokenGuard, IsOwnerGuard)  @UseInterceptors(FileInterceptor('image'))  @Post('/profile-image-upload/:userid')  async uploadProfileImage(    @UploadedFile() file: Express.Multer.File,    @Param('userid') userid: string,    @Request() req,  ) {    console.log("Endpoint's been hit");    const user = req?.user?.payload?.data;    console.log('Details from User Controller: ', userid, user, file);    return handleResponse({      success: true,      data: [await this.userService.uploadProfileImage(file, userid, user)],      message: 'Profile image uploaded successfully',    });  }

Backend Code (Service)

async uploadProfileImage(    file: Express.Multer.File,    userid: string,    user: Partial<User>,  ) {    try {      console.log('Details from User Service: ', userid, user, file);      const userFromDb = await this.UserModel.findById(userid);      if (userFromDb.email !== user.email) {        throw new HttpException('You cannot update a profile that is not yours',          400,        );      }      //DELETE PROFILE IMAGE FROM S3 IF IT EXISTS      if (userFromDb.profilePicKey) {        console.log('key: ', userFromDb.profilePicKey);        await this.s3Service.deleteFile(userFromDb?.profilePicKey);      }      const key = `${file.fieldname}${Date.now()}`;      const imageUrl = await this.s3Service.uploadFile(file, key);      const updatedUser = await this.UserModel.findByIdAndUpdate(        { _id: userid },        {          profilePic: imageUrl,          profilePicKey: key,        },        { new: true },      );      return {        profilePic: updatedUser?.profilePic,        _id: updatedUser?._id,      };    } catch (error) {      // console.log(error?.message);      throw new HttpException(        error?.message || 'An error occured. Unable to upload profile image',        error?.status || 500,      );    }  }

Viewing all articles
Browse latest Browse all 6290

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>