如何在React中将文件转换为Base64

Bok*_*oky 1 javascript base64 filereader reactjs

我已经在React中注册了,我需要将文件上传到服务器。这些文件需要Base64编码。

对其进行编码的函数如下:

getBase64(file) {
        let document = "";
        let reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function () {
            document = reader.result;
        };
        reader.onerror = function (error) {
            console.log('Error: ', error);
        };

        return document;
    }
Run Code Online (Sandbox Code Playgroud)

而处理表单的下一步按钮的功能如下:

handleNextButtonClick(event){
    event.preventDefault();
    let data = {domainId: this.props.user[0].domainId, name: steps.stepThree, values: this.state.files};

    let idCard = this.state.files.filter(file => file.file_type === "ID_CARD")[0].values.file;
    let statuses = this.state.files.filter(file => file.file_type === "STATUTES")[0].values.file;
    let blankLetterHead = this.state.files.filter(file => file.file_type === "LETTER_HEAD")[0].values.file;
    let companyPhoto = this.state.files.filter(file => file.file_type === "COMPANY_PICTURE")[0].values.file;


    let idCardBase64 = this.getBase64(idCard);
    let statusesBase64 = this.getBase64(statuses);
    let blankLetterHeadBase64 = this.getBase64(blankLetterHead);
    let companyPhotoBase64 = this.getBase64(companyPhoto);
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我控制台日志,this.state.files.filter(file => file.file_type === "ID_CARD")[0].values.file;我会得到

在此处输入图片说明

一切似乎都还可以,但是我遇到了错误:

Uncaught TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'.

任何想法如何解决这个问题?

更新

let idCardBase64 = idCard ? this.getBase64(idCard) : "";
let statusesBase64 = statuses ? this.getBase64(statuses) : "";
let blankLetterHeadBase64 = blankLetterHead ? this.getBase64(blankLetterHead) : "";
let companyPhotoBase64 = companyPhoto ? this.getBase64(companyPhoto) : "";
Run Code Online (Sandbox Code Playgroud)

我改了 并且在这种情况下仅存在idCard。现在,我没有得到任何错误,但idCardBase64就是""不Base64编码。

小智 8

如果你只使用https://www.npmjs.com/package/react-file-base64它会让事情变得更简单。

使用下面的内容作为表单中的输入字段来为您处理编码。

我的代码如下所示,供参考。

<FileBase type="file" multiple={false} onDone={({base64}) => setListingData({ ...listingData, selectedFile: base64})}/>
Run Code Online (Sandbox Code Playgroud)


Mos*_*ara 7

此外,您可以使用这个 React 组件React File Base64

检查演示


小智 5

文件读取是异步的。因此请使用回调或Promise解决您的问题。

let idCardBase64 = '';
this.getBase64(idCard, (result) => {
     idCardBase64 = result;
});
Run Code Online (Sandbox Code Playgroud)

并使用回调函数返回您获得的数据。

getBase64(file, cb) {
    let reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function () {
        cb(reader.result)
    };
    reader.onerror = function (error) {
        console.log('Error: ', error);
    };
}
Run Code Online (Sandbox Code Playgroud)