Ember-cli-file-picker
An addon for ember-cli that provides a component to easily add a filepicker to your ember-cli app.
It supports:
- A preview of the uploaded file
- A dropzone to drag and drop your file
- Currently it only support single file uploads but multiples will come soon
Installation
ember install ember-cli-file-picker
Changelog
0.0.8
- [ENHANCEMENT] Add
hideFileInput
option to configure the file input visibility.
0.0.7
0.0.6
- removes "Binding style attributes..." warning
0.0.5
- ember-cli-file-picker now depends on ember >=
1.11.1
Usage
{{#file-picker fileLoaded="fileLoaded"}}
Drag here or click to upload a file
{{/file-picker}}
Options
accept
default *
multiple
default false
selectOnClick
default true
dropzone
default true
preview
default true
progress
default true
hideFileInput
default true
readAs
default readAsFile
Options:
* readAsFile
* readAsArrayBuffer
* readAsBinaryString
* readAsDataURL
* readAsText
Actions
fileLoaded
Implement fileLoaded
in your controller to handle the file.
Example:
import Ember from 'ember';
export default Ember.ObjectController.extend({
actions: {
fileLoaded: function(file) {
console.log(file.name, file.type, file.size);
console.log(file.filename, file.type, file.data, file.size);
}
}
});
Bindings
Validations
If you need to validate the files you can subclass the component and add a filesAreValid
method.
The method should return a falsy value to stop file handling.
import Ember from 'ember';
import FilePicker from 'ember-cli-file-picker/components/file-picker';
export default FilePicker.extend({
filesAreValid: function(files) {
this.get('errors').addObject('wrong file type');
return false;
}
});
CSS
The addon provides the following classes to style the file-picker:
.file-picker(.single|multiple &.over)
.file-picker__preview
.file-picker__preview__image.single
.file-picker__preview__image.multiple
.file-picker__progress
.file-picker__preview__value
.file-picker__dropzone
.file-picker__input
Use with CarrierWave
import DS from 'ember-data';
var attr = DS.attr;
export default DS.Model.extend({
image: attr('raw')
});
import DS from 'ember-data';
import Ember from 'ember';
export default DS.Transform.extend({
deserialize: function(serialized) {
return Ember.isNone(serialized) ? {} : serialized;
},
serialize: function(deserialized) {
return Ember.isNone(deserialized) ? {} : deserialized;
}
});
// app/templates/application.hbs
{{#file-picker
accept=".jpg,.jpeg,.gif,.png"
fileLoaded="fileLoaded"
readAs="readAsDataURL"
}}
import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
fileLoaded: function(file) {
var post = this.get('store').createRecord('post', {
image: file
});
post.save();
}
}
});
class PostsController < ApplicationController
def create
params[:post][:image] = convert_to_upload(params[:post][:image])
@post = Post.create(params)
end
protected
def convert_to_upload(image)
image_data = split_base64(image[:data])
temp_img_file = Tempfile.new("data_uri-upload")
temp_img_file.binmode
temp_img_file << Base64.decode64(image_data[:data])
temp_img_file.rewind
ActionDispatch::Http::UploadedFile.new({
filename: image[:filename],
type: image[:type],
tempfile: temp_img_file
})
end
def split_base64(uri_str)
if uri_str.match(%r{^data:(.*?);(.*?),(.*)$})
uri = Hash.new
uri[:type] = $1
uri[:encoder] = $2
uri[:data] = $3
uri[:extension] = $1.split('/')[1]
return uri
end
end
end
Running
Running Tests
ember test
ember test --server
Building
For more information on using ember-cli, visit http://www.ember-cli.com/.
Publishing
npm version 0.0.X
git push origin master
git push origin --tags
npm publish