6

I am building a component which has file input fields and being rendered through function in VueJs:

export default {
    name: 'nits-file-input',
    props: {
        label: String,
    },
    render (createElement) {
        return createElement('div', { class: 'form-group m-form__group'}, [
            createElement('label', this.label),
            createElement('div'),
            createElement('div', { class: 'custom-file'},[
                createElement('input', {
                    class: 'custom-file-input',
                    attrs: { type: 'file' },
                    domProps: {
                        value: self.value
                    },
                    on: {
                        input: (event) => {
                            var reader = new FileReader()
                            reader.readAsDataURL(event.target.value)
                            reader.onload = function () {
                                console.log(reader.result);
                            };
                            this.$emit('input', event.target.value)
                        }
                    }
                }),
                createElement('label', { class: 'custom-file-label'}, 'Choose File')
            ])
        ])
    }
}

While having the values in v-model I get the path of file but I need to have a base64 element. currently in my console I'm getting following error:

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

file upload error

Help me out in execution. Thanks

Boussadjra Brahim
  • 82,684
  • 19
  • 144
  • 164
Nitish Kumar
  • 6,054
  • 21
  • 82
  • 148

2 Answers2

11

You should set reader.readAsDataURL(event.target.files[0])

instead of

reader.readAsDataURL(event.target.value) :

on: {
    input: (event) => {
        var reader = new FileReader()
        reader.readAsDataURL(event.target.files[0])
        reader.onload = () => {
            console.log(reader.result);
        };
        this.$emit('input', event.target.files[0])
    }
}
Boussadjra Brahim
  • 82,684
  • 19
  • 144
  • 164
  • 1
    Hi, I'm unbale to assign base64 value inside my `$emit` function. I am using `let baseFile = '' reader.onload = function () { baseFile = reader.result }; this.$emit('input', baseFile)` can you help with that? – Nitish Kumar Dec 27 '18 at 12:24
  • i hope that i could, please post a new question where you explain your use case and the issue that you're getting – Boussadjra Brahim Dec 27 '18 at 12:29
  • 1
    here it is https://stackoverflow.com/questions/53945241/assigning-converted-base64-values-in-javascript-in-vuejs-function – Nitish Kumar Dec 27 '18 at 12:37
3

Change to reader.readAsDataURL(event.target.files[0])

Following post could be helpful https://alligator.io/vuejs/file-reader-component/

Maxim
  • 2,233
  • 6
  • 16