Проблемы при загрузке изображения в хранилище Firebase с помощью действия загрузки Antd - PullRequest
3 голосов
/ 02 апреля 2019

Я использую antd picture-wall / card пример для загрузки изображений в мое хранилище Firebase с этим ссылочным кодом , и единственное место, которое я изменяю, это свойство action на <Upload> компонент.

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

Моя функция действия выглядит следующим образом;

export async function uploadImage(file) {
    const storage = firebase.storage()
    const metadata = {
        contentType: 'image/jpeg'
    }
    const storageRef = await storage.ref()
    const imageName = generateHashName() //a unique name for the image
    const imgFile = storageRef.child(`Vince Wear/${imageName}.png`)
    return imgFile.put(file, metadata)
}

Проблема возникает, Изображение успешно загружено в firebase, но я продолжаю получать ошибки обработки ответов и, возможно, не уверен, что функция action должна возвращать, даже если в документации написано, что она должна вернуть обещание.

Сообщение об ошибке:

XML Parsing Error: syntax error
Location: http://localhost:3000/[object%20Object]
Line Number 1, Column 1:

Ошибки также отображаются в виде красной рамки на миниатюре загруженного изображения.

Запрошенная помощь, Что должна вернуть моя функция действия, чтобы избавиться от ошибок. Я могу проанализировать свой ответ Firebase и вернуть необходимые данные в действие загрузки и .dd.

Использование

    "antd": "^3.9.2",
    "firebase": "^5.8.5",
    "react": "^16.7.0",

1 Ответ

1 голос
/ 06 апреля 2019

Вы можете использовать customRequest prop, чтобы решить эту проблему. Посмотрите

class CustomUpload extends Component {
  state = { loading: false, imageUrl: '' };
  
  handleChange = (info) => {
    if (info.file.status === 'uploading') {
      this.setState({ loading: true });
      return;
    }
    if (info.file.status === 'done') {
      getBase64(info.file.originFileObj, imageUrl => this.setState({
        imageUrl,
        loading: false
      }));
    }
  };

  beforeUpload = (file) => {
    const isImage = file.type.indexOf('image/') === 0;
    if (!isImage) {
      AntMessage.error('You can only upload image file!');
    }
    
    // You can remove this validation if you want
    const isLt5M = file.size / 1024 / 1024 < 5;
    if (!isLt5M) {
      AntMessage.error('Image must smaller than 5MB!');
    }
    return isImage && isLt5M;
  };

  customUpload = ({ onError, onSuccess, file }) => {
    const storage = firebase.storage()
    const metadata = {
        contentType: 'image/jpeg'
    }
    const storageRef = await storage.ref()
    const imageName = generateHashName() //a unique name for the image
    const imgFile = storageRef.child(`Vince Wear/${imageName}.png`)
    try {
      const image = await imgFile.put(file, metadata);
      onSuccess(null, image))
    catch(e) {
      onError(e);
    }
  };
  
  render () {
    const { loading, imageUrl } = this.state;
    const uploadButton = (
    <div>
      <Icon type={loading ? 'loading' : 'plus'} />
      <div className="ant-upload-text">Upload</div>
    </div>
    );
    return (
      <div>
        <Upload
          name="avatar"
          listType="picture-card"
          className="avatar-uploader"
          beforeUpload={this.beforeUpload}
          onChange={this.handleChange}
          customRequest={this.customUpload}
        >
          {imageUrl ? <img src={imageUrl} alt="avatar" /> : uploadButton}
        </Upload>
      </div>
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...