FileUpload via Ajax, Bottle

Django, Flask, Bottle, WSGI, CGI…
Antworten
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Hey ho mal wieder eine kleine Frage...wahrscheinlich eher an leute die sich etwas mit ajax auskenne...ich jedenfalls kann es nicht..

folgendes: Ich möchte einfach ein bild hochladen und in meine DB speichern bzw den pfad....das funktioniert auch alles wenn ich kein AJAX benutze....sobald ich das script einbaue bekomme ich die datei nicht.

hier mal der code...

Bottle template

Code: Alles auswählen

def upload_data_submit(db):
	if cookie():
  		data = request.files.datas
  		sql=db.execute('SELECT ML_ID FROM ML ORDER BY ML_ID DESC')
  		row=sql.fetchone()
		ID=str(row[0])
		fotopath = do_upload(data,cookie(),ID)
		print fotopath
		sql=db.execute('UPDATE ML SET MLKuenstlerfotoPath = ? WHERE ML_ID = ?',(fotopath,ID,))
	        return template("hauptmenu")
	else:
		return template("login")
upload

Code: Alles auswählen

def do_upload(data,StudName,ID):
	path = 'static/images'
	if data:
	  raw = data.file.read()
	  with open(os.path.join(path, StudName+ID),'wb') as files:
	    files.write(raw)
	  fotopath = path+'/'+StudName+ID
	  return fotopath
ajax:

Code: Alles auswählen

$(".upload").bind("submit", function() {
    // Ajax-Call
    $.ajax({
        url: "/upload_data_submit",
        data: $("#dataform").serialize(), 
        type: "POST",
        processData: false,
        contentType: false,
        success: function(msg)
            {
                /* form-div verstecken, seite nachladen & wieder einblenden (2000 ms) */
                $("#contenti").hide().load("/upload_data").fadeIn(2000);
            }
});
.serialize(), scheint für daten nicht das richtige zu sein...bei text etc funktioniert es, bei daten nicht. hat einer eine Ahnung wie ich stattdessen ran gehen muss?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Natürlich kannst Du per Javascript nicht auf Dateien zugreifen, das verbietet sich aus Sicherheitsgründen.
Eine Suche nach »ajax file upload« liefert Dir aber tausende Bibliotheken, die Workarounds bereitstellen.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

für alle die es irgendwann mal suchen

Code: Alles auswählen

$('.upload').on('change', '#fileUploader', function() {

    // Post-Daten vorbereiten
    var file = this.files[0];
    var submitbutton = $('#submitbutton');
    
    var data = new FormData();
    data.append('datas', file);
    var size = file.size;
    if (size > 20000) 
    {
	alert("Datei ist zu Groß!");
	submitbutton.attr('disabled', '');
    }
    else
    {
      // Ajax-Call
      $.ajax({
        url: '/upload_data_submit',
        data: data,
        type: 'POST',
        processData: false,
        contentType: false,
	success: function(msg)
        {
                /* form-div verstecken, seite nachladen & wieder einblenden (2000 ms) */
                $("#contenti").hide().load("/hauptmenu").fadeIn(2000);
        }
      });
     }
    return false;
});

weitere frage noch...gibt es eine möglichkeit "alerts" aus bottle zu bekommen und über ajax ein zu blenden?
bsp:
Ich will mich registrieren -> daten werden übermittelt -> datenbank merkt, upps user existiert bereits -> ALERT zurück? wo muss ich da mal schauen
Antworten