Django hacer POST desde javascript con contenido binario


Si queremos hacer un POST con contenido binario como una imagen desde el navegador contra Django, tenemos que tener en cuenta que la llamada a ajax  codifica el stream en UTF-8.

Para desactivar este funcionamiento y hacer el envío "raw" tenemos que poner el responseType como 'blob', de esta forma:

    $("#bt_envia").on("click", function (e) {

var x = new XMLHttpRequest();
x.onload = function() {
// Create a form
var fd = new FormData();
fd.append("upfile", x.response); // x.response is a Blob object
fd.append("csrfmiddlewaretoken", "{{ csrf_token }}");

// Upload to your server
var y = new XMLHttpRequest();
y.onload = function() {
alert('Fichero subido!!');
};
y.open('POST', '/gestion/prova/');
y.send(fd);
};
x.responseType = 'blob';
x.open('GET', 'http://planetary.s3.amazonaws.com/assets/images/spacecraft/2013/20131108_2013-3896_f537.jpg', true);
x.send();

En la parte del servidor, los FILES nos vendrán directamente en el formato nativo, así que sólo tenemos que tratarlos directamente, por ejemplo grabando una imagen en un fichero.

def prova(request):
#print str(request.body)
# veure https://docs.djangoproject.com/en/dev/topics/http/file-uploads/
print "Els files son ", str(request.FILES)
f = request.FILES['upfile']
with open('c:/prova.jpg', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)

return HttpResponse('Mu guay')


Fuente: varios en stackoverflow