2014-11-19 16 views
8

W IE9, FormData nie jest obsługiwany, co sprawia, że ​​przesyłanie plików przy użyciu XMLHttpRequest jest znacznie mniej banalne.Przesyłanie plików przy użyciu AJAX bez FormData (IE9)

Czy to można zrobić? Widziałem już wspomnienia iFrames i chociaż nie jestem przeciwny napisaniu jakiegoś owłosionego kodu, nie mam pojęcia, jak to osiągnąć (wiele zasobów mówi o przesyłaniu do iFrame, ale nie o tym, jak zdobyć plik z iFrame na serwer).

Korzystanie z vanilla JavaScript (bez bibliotek stron trzecich), w jaki sposób jeden plik zostałby przesłany asynchronicznie bez użycia numeru FormData?

+0

Chodzi o to, że piszesz do serwera za pośrednictwem iframe. W rzeczywistości nie ma w tym udziału AJAX. Możesz sprawić, że będzie wyglądać jak AJAX, ukrywając element iframe i zwracając niektóre informacje do klienta za pośrednictwem elementu iframe po zakończeniu przesyłania pliku (np. Nazwę pliku i informacje o powodzeniu lub niepowodzeniu). – BrianS

+0

ponieważ jest bez FileReadera (http://caniuse.com/#feat=filereader), IE9 musi użyć formularza do wysłania plików na serwer. element iframe nie jest potrzebny, ale może złapać odpowiedź serwera i wygląda lepiej, jeśli odpowiedź na przesłanie nie jest funkcjonalną stroną html. – dandavis

+0

Może być uważany za duplikat http://stackoverflow.com/questions/7909161/jquery-iframe-file-upload. Przynajmniej odpowiedź jest tutaj. – hon2a

Odpowiedz

7

Ten kod powinien wystarczyć. Niestety było dawno temu i myślałem, że IE9 również może przesłać za pomocą XHR (powinno, ale jest to opcja iframe).

Czyni następujące:

  1. Dodaj wejście plik na swojej stronie (można również wykonać w HTML)
  2. Odłóż ten selektor plików w formie
  3. dodać poświadczenia do formularza
  4. Prześlij formularz do elementu iframe i użyj jego strony jako wartości zwracanej.
fileSelection = document.createElement("div"); 
//create the file input 
fileSelection.browseSelect = document.createElement("input"); 
fileSelection.browseSelect.type = "file"; 
fileSelection.browseSelect.name = "file[]"; 
fileSelection.browseSelect.style.display = "block"; 
fileSelection.browseSelect.style.position = "absolute"; 
fileSelection.browseSelect.style.left = "50%"; 
fileSelection.browseSelect.style.top = "auto"; 
fileSelection.browseSelect.style.height = "36px"; 
fileSelection.browseSelect.style.width = "36px"; 
fileSelection.browseSelect.style.bottom = "0px"; 
fileSelection.browseSelect.style.margin = "0px 0px -1px 90px"; 
fileSelection.browseSelect.style.filter = "alpha(opacity=0)"; 
fileSelection.browseSelect.style.zIndex = 14; 

//Put a form in it. 
fileSelection.form = document.createElement("form"); 
fileSelection.form.method = "POST"; 
fileSelection.form.action = [url to server]; //put your own file upload handler here. 
fileSelection.form.enctype = "multipart/form-data"; 
fileSelection.form.encoding = "multipart/form-data"; 
fileSelection.appendChild(fileSelection.form); 
//Append the file input to the form. 
fileSelection.form.appendChild(fileSelection.browseSelect); 

document.body.appendChild(fileSelection); 

function doUploadObjectUpload() 
{ 
    var tempFrame = document.createElement("iframe"); 
    tempFrame.src = ""; 
    tempFrame.allowTransparancy = "true"; 
    tempFrame.style.display = "none"; 
    tempFrame.frameBorder = 0; 
    tempFrame.style.backgroundColor = "transparent"; 
    tempFrame.onload = followUpOnHTML4Upload.bind(this,tempFrame); 

    tempFrame.name = "tmpFrameUpload" 
    this.appendChild(tempFrame); 
    this.form.target = tempFrame.name; 
    this.form.name = "uploadForm"; 
    this.form.acceptCharset = "UTF-8" 

    //This is an example of a hidden input, used to pass extra vars to the server. Add more if you need them. 
    var tempNodePath = document.createElement("input"); 
    tempNodePath.type = "hidden"; 
    tempNodePath.value = [dir]; //if you want specify a target path. 
    tempNodePath.name = "filePath"; 
    this.form.insertBefore(tempNodePath, this.form.childNodes[0]); 

    this.form.submit(); 
} 

function followUpOnHTML4Upload(frameId) 
{ 
     //Here you can check the response that came back from the page. 
} 

PHP na przykład będzie przechowywać pliki w $_FILES

+0

O czym jest ten kod? To nie miało nic wspólnego z zapytaniem autora. –

+1

@AlexG, proszę powiedz mi, jak to nie jest zgodne z tym, czego autor chce (oprócz faktu, że przyjął rozwiązanie). – Mouser

Powiązane problemy