ember.js - logger - helpers ember
Carga de archivo con datos de Ember (4)
Aquí hay una parte de un adaptador de datos de ember que escribí para subir los archivos (el mismo servidor, sin dominio cruzado)
DS.DjangoRESTAdapter = DS.RESTAdapter.extend({
bulkCommit: false,
createRecord: function(store, type, record) {
var root = this.rootForType(type), json = {};
var data = new FormData();
data.append(''username'', record.get(''username''));
data.append(''attachment'', record.get(''attachment''));
this.django_file_ajax(''http://localhost:8000/people/new/'', "POST", {
data: data,
context: this,
success: function(pre_json) {
json[root] = pre_json;
this.didCreateRecord(store, type, record, json);
}
});
},
django_file_ajax: function(url, type, hash) {
hash.url = url;
hash.type = type;
hash.contentType = false;
hash.processData = false;
hash.context = this;
jQuery.ajax(hash);
}
});
})();
No es tan fácil para IE8 porque utilizo el ayudante "FormData" para hacer una carga de archivos de varias partes, pero es una buena prueba de concepto.
Aquí está el modelo de datos ámbar para ir con el adaptador anterior
PersonApp.Person = DS.Model.extend({
id: DS.attr(''number''),
username: DS.attr(''string''),
attachment: DS.attr(''string'')
});
Aquí está la plantilla de manubrios
<script type="text/x-handlebars" data-template-name="person">
{{view PersonApp.UploadFileView name="logo_image" contentBinding="content"}}
</script>
Aquí está la vista de la brasa personalizada
PersonApp.PersonView = Ember.View.extend({
templateName: ''person''
});
PersonApp.UploadFileView = Ember.TextField.extend({
type: ''file'',
attributeBindings: [''name''],
change: function(evt) {
var self = this;
var input = evt.target;
if (input.files && input.files[0]) {
var reader = new FileReader();
var that = this;
reader.onload = function(e) {
var fileToUpload = e.srcElement.result;
var person = PersonApp.Person.createRecord({ username: ''heyo'', attachment: fileToUpload });
self.get(''controller.target'').get(''store'').commit();
}
reader.readAsDataURL(input.files[0]);
}
}
});
Si desea ver un pico completo con este en proceso de pago, un ejemplo de carga de archivos múltiples que hice recientemente.
¿Puede alguien proporcionar ejemplos de código o documentación sobre la implementación de un formulario con un campo de archivo usando EmberJS y Ember Data?
Ya estoy familiarizado con Ember Data, pero no estoy seguro de cómo implementar cargas de archivos correctamente.
Es bastante simple, los pasos generales son:
- Conecte una entrada dentro de Ember.
- Lea los datos del archivo local especificado en el elemento de entrada.
- Codificó los datos como base64.
- Establezca el valor de su modelo de datos ámbar en la cadena base64.
- En el servidor, decodifique la cadena base64 y listo, los datos de su archivo binario estarán en el servidor.
Sin embargo, debe tenerse en cuenta que la codificación de bases64 de archivos grandes tiene problemas de rendimiento, pero para imágenes más pequeñas o texto no será un problema.
También puede enviar el archivo ''afuera'' de Ember Data y enviar la respuesta (como una carga útil JSON que representa un modelo) a la tienda a través de pushPayload
. Si es así, se pueden usar FormData
u otros métodos en XHR2.
Lea más sobre la manipulación de archivos en el lado del cliente aquí: http://www.html5rocks.com/en/tutorials/file/dndfiles/
Obtenga más información sobre XHR2 y FormData para subir archivos aquí: http://www.html5rocks.com/en/tutorials/file/xhr2/
Intenté algunas soluciones diferentes y terminé escribiendo un adaptador de FormData y una transformación de archivo. Entonces, cualquier modelo que necesite cargar datos de archivos puede usar FormDataAdapter y definir los atributos del archivo como tipo "archivo":
aplicación / transformaciones / archivo.coffee
FileTransform = DS.Transform.extend
serialize: (jsonData) ->
jsonData
deserialize: (externalData) ->
externalData
app / models / user.coffee
User = DS.Model.extend
avatar: DS.attr(''file'')
aplicación / adaptadores / form_data.coffee
get = Ember.get;
App.FormDataAdapter = ApplicationAdapter.extend
ajaxOptions: (url, type, hash) ->
hash = hash || {}
hash.url = url
hash.type = type
hash.dataType = ''json''
hash.context = @
if hash.data and type != ''GET'' and type != ''DELETE''
hash.processData = false
hash.contentType = false
fd = new FormData()
root = Object.keys(hash.data)[0]
for key in Object.keys(hash.data[root])
if hash.data[root][key]
fd.append("#{root}[#{key}]", hash.data[root][key])
hash.data = fd
headers = get(@, ''headers'')
if headers != undefined
hash.beforeSend = (xhr) ->
for key in Ember.keys(headers)
xhr.setRequestHeader(key, headers[key])
hash
app / adapters / user.coffee
UserAdapter = FormDataAdapter.extend()
Perdón por el CoffeeScript, pero está pegado en esta publicación del blog: http://blog.mattbeedle.name/posts/file-uploads-in-ember-data/ . Puedes leer una descripción más detallada allí. Esta solución probablemente debería combinarse con una entrada HTML5 FileReader para habilitar las vistas previas de imágenes y la validación del tipo de archivo del lado del cliente.
Mira los enlaces a continuación. El primer enlace o publicación de blog contiene un enlace a un jsfiddle de trabajo que maneja la carga con emberjs. Tenga en cuenta que no escribí el blog ni creé el violín. Pero debería resolver tu problema.
http://chrismeyers.org/2012/06/12/ember-js-handlebars-view-content-inheritance-image-upload-preview-view-object-binding/ - enlace muerto
http://devblog.hedtek.com/2012/04/brief-foray-into-html5-file-apis.html