将文件上传到Flask Restplus 400错误

时间:2019-12-02 20:23:49

标签: reactjs flask react-redux flask-restplus

我们有一个简单的后端Flask服务器API,使用flask_restplus将照片文件上传到S3,如下所示:

import werkzeug
from flask_restplus import reqparse

photoParser = reqparse.RequestParser()
photoParser.add_argument('photo',
                     type=werkzeug.datastructures.FileStorage,
                     location='files',
                     required=True,
                     help='photo')

…
@photoNamespace.route("/upload")
class UploadPhoto(Resource):
    @api.expect(photoParser)
    def post(self):
        args = photoParser.parse_args()
        photo = args['photo']
        filename = datetime.utcnow().strftime('%m%d%Y_%H%M%S_') + photo.filename

        try:
            s3.upload_fileobj(
                photo,
                S3_PHOTO_BUCKET,
                filename,
                ExtraArgs={
                    "ACL": "public-read",
                    "ContentType": photo.content_type
                }
            )

我们可以使用swagger界面和简单的HTML表单(输入名为“ photo”)将照片成功上传到S3存储桶。但是,我们当前的React上传在后端出现400错误,并且被flask服务器中的行args = photoParser.parse_args()停止了。 axios请求在底部的按钮中发出。

export interface MyFile extends File {
  path?: string /* etc */;
  preview?: string;
}

export const PhotoDropZone = (props: IPhotoDropZoneProps) => {
  const initialFiles: MyFile[] = [];
  const [files, setFiles] = useState(initialFiles);

  const { getRootProps, getInputProps } = useDropzone({
    accept: 'image/*',
    onDrop: acceptedFiles => {
      setFiles(prevFiles => {
    return prevFiles.concat(
      acceptedFiles.map(file => {
        const newFile: MyFile = Object.assign(file, {
          preview: URL.createObjectURL(file)
        });
        return newFile;
      })
    );
  });
}
  });

  const uploads = files.map((file: MyFile) => {
console.log(files);
    return (
      <SPhotoPreview key={file.path}>
        <SPhotoImgContainer>
          <SPhotoPreviewImg src={file.preview} />
        </SPhotoImgContainer>
      </SPhotoPreview>
    );
  });

  return (
    <SPhotoDropSection size='md'>
      <SPhotoDropContainer {...getRootProps({ className: 'dropzone' })}>
        <input {...getInputProps()} />
            <Icon
              icon='camera'
              height={32}
              width={32}
              fill={Styles.Colors.brand.blue}
            />
        <p>Upload photo</p>
      </SPhotoDropContainer>

  {files.length === 0 ? (
    <h1>Empty files</h1>
  ) : (
    <aside>
      <h4>Files</h4>
      <SPhotoPreviewList>{uploads}</SPhotoPreviewList>
    </aside>
  )}

  <Button
    onClick={async () => {
      const uploadPhotoURL = `${API_URI}/photo/upload`;
      console.log(uploadPhotoURL);
      console.log(files)

      const user = await axios({
        method: 'post',
        url: uploadPhotoURL,
        data: {
          photo: files[0]
        }
      });
    }}
  >
    Upload
  </Button>
</SPhotoDropSection>
  );
};

我怀疑请求中文件的格式有问题,但是我不知道发生了什么。

0 个答案:

没有答案