Невозможно удалить изображения с устройств Android, используя реагировать родной RNFetchBlob - PullRequest
0 голосов
/ 05 марта 2019

Я хочу разработать приложение, которое будет делать фотографии и загружать их в AWS s3.Теперь я хочу удалить снятые изображения из галереи один раз после загрузки.

Используя библиотеку RNFetchBlob, я могу добиться этого.Я попытался удалить изображения один раз после съемки.Работает отлично.Но я хочу удалить их один раз после загрузки в облако.Поэтому я создал метод, чтобы сделать это, и есть переменная isUploaded, которая установлена ​​в false, и как только загрузка завершена, я устанавливаю это состояние переменной как true, и внутри метода render я вызвал метод delete images.Но это не удаление изображений.Я не понял, где ошибся.

Можете ли вы помочь мне решить эту проблему?

export default class Upload extends Component {

constructor(props) {
    super(props);
      storeFilePath :[],
      saveImages :[],
      isUploaded:false
    }
  }

takePic = async function() {

      var date = new Date();
      var time = date.getTime();
      this.setState({capturedTime:time});

       console.log(this.state.connection_Status);

     if(this.state.connection_Status==="Online"){
        this.getServerTime();
        this.setState({capturedTime:this.state.serverTime.currentFileTime+'_'+time});
        console.log(this.state.capturedTime); 
        console.log("availble");
      } 
        const options = {
          quality: 1.0,
          maxWidth: 75,
          maxHeight: 75,
          base64: true
      }

    ImagePicker.launchCamera(options,(responce)=>{

       this.state.testImage.push({ uri: responce.uri });

      const file ={
        uri : responce.uri,
        name : responce.fileName;
        method: 'POST',
        width : 50,
        height : 50,
        path : responce.path,
        type :  responce.type,
        notification: {
            enabled: true
          }
      }
        this.state.saveImages.push(file);
        this.state.storeFilePath.push(responce.path);

    })
  }

  _upload=(saveImages)=>{
      const config ={
          keyPrefix :'***/',
          bucket : '****',
          region :'***',
          accessKey:'**************',
          secretKey :'**/*+*****',
          successActionStatus :201
        }

        this.state.saveImages.map((image) => {
         RNS3.put(image,config)
        .then((responce) => {
            console.log('=============********************================');
            console.log(image);
            this.setState({ isUploaded: true }); 
          });
        });

        Alert.alert('Successfully, saved');
      } 

  deleteImages=(storeFilePath)=>{
    this.state.storeFilePath.map((path) => {
      RNFetchBlob.fs.unlink(path)
        .then(() => {
          console.log('Delete images once after file upload is done');
        });
      });
  }

  render() {
      return (

          if(this.state.isUploaded===true){
              this.deleteImages(this.state.storeFilePath);
          } 

        <View>
          <View style={styles.Camera}>
            <TouchableOpacity onPress={this.takePic.bind(this)}>
              <Text>Take Picture</Text>
            </TouchableOpacity>
          </View>
          <View style={styles.Send}>
            <TouchableOpacity onPress={() => this._upload()}>
              <Text>Send</Text>
            </TouchableOpacity>
          </View>
        </View>
      );
  }
}

1 Ответ

0 голосов
/ 05 марта 2019

takePic

Вы изменяете состояние в вашей takePic функции

this.state.saveImages.push(file);
this.state.storeFilePath.push(responce.path);

Это может привести к исчезновению мутаций при обновлении вашего состояния. Это может означать, что загруженные вами изображения не удаляются из-за того, что пути к ним были потеряны.

Вы должны правильно вызвать setState, взяв предыдущее значение состояния, добавив новые значения и затем обновив его.

this.setState(prevState => {
  // get the previous state values for the arrays
  let saveImages = prevState.saveImages;
  let storeFilePath = prevState.storeFilePath;

  // add the values to the arrays like before
  saveImage.push(file);
  storeFilePath.push(responce.path);

  // return the new state
  return {
   saveImages, 
   storeFilePath
  }
});

Если вы хотите проверить состояние, если вы только что установили его, вы должны , а не сделать следующее:

this.setState({capturedTime:this.state.serverTime.currentFileTime+'_'+time});
console.log(this.state.capturedTime); // <- this is not guaranteed to be correct

Вы должны использовать функцию обратного вызова, которая поставляется с setState. Вы должны обновить свой код так:

this.setState({capturedTime:this.state.serverTime.currentFileTime+'_'+time}, 
  () => console.log(this.state.capturedTime)
);

Это обеспечит обновление state, так что ваш console.log должен показать вам правильное значение.

deleteImages

В вашей функции deleteImages вы передаете параметр storeFilePath, но не используете его, так как обращаетесь к storeFilePath напрямую из state.

deleteImages=(storeFilePath)=>{ // <- storeFilePath is not used
    this.state.storeFilePath.map((path) => {
      RNFetchBlob.fs.unlink(path)
        .then(() => {
          console.log('Delete images once after file upload is done');
        });
      });
}

Вы можете использовать его и переписать функцию как:

deleteImages=(storeFilePath)=>{ 
    storeFilePath.map((path) => {
      RNFetchBlob.fs.unlink(path)
        .then(() => {
          console.log('Delete images once after file upload is done');
        });
      });
}

или вы можете просто проигнорировать параметр вместе и сделать следующее:

deleteImages=()=>{ 
    this.state.storeFilePath.map((path) => {
      RNFetchBlob.fs.unlink(path)
        .then(() => {
          console.log('Delete images once after file upload is done');
        });
      });
}

1042 * делает * Вы не должны вызывать вашу deleteImages функцию в вашем render. Вы должны использовать методы жизненного цикла компонента React. Мы можем использовать componentDidUpdate, чтобы проверить, были ли загружены изображения, а затем позвонить deleteImages componentDidUpdate(prevProps, prevState) { if (this.state.isUploaded) { this.deleteImages(); // <- see above about refactoring this function } } _upload

Я не уверен на 100%, что это правильный способ загрузки. Как и в deleteImages, вы не используете передаваемый параметр.

_upload=(saveImages)=>{
   const config ={ ... }

   this.state.saveImages.map((image) => {
     RNS3.put(image,config)
    .then((responce) => {
        console.log('=============********************================');
        console.log(image);
        this.setState({ isUploaded: true }); 
      });
    });

    Alert.alert('Successfully, saved');
 } 

Я думаю, что вы, вероятно, должны использовать Promise.all (кажется, больше здесь ), чтобы справиться с этим. Также this.setState({ isUploaded: true }); будет вызываться для каждого загружаемого вами изображения, вызывая повторную визуализацию и вызывая вашу функцию deleteImages, так как состояние теперь будет истинным. Примерно так может быть лучше:

_upload () => { // <- again you are not using the parameter that you are passing
  const config = { ... }
  Promise.all(this.state.saveImages.map(image => RNS3.put(image, config))).then(values => {
    this.setState({isUploaded: true});
    alert('Successfully, saved);
    // though why delete images on a state change, why not delete them here now that the upload has completed?
  })
}

Вот несколько замечательных статей по setState.

...