2010-06-10 5 views
9

Używając javascript, mam plik w łańcuchu (mający żądanie ajax).Jak załadować ciąg jako plik z jQuery lub inną strukturą js

Jak przesłać go jako plik do serwera przez inne żądanie ajax?

+1

Proszę wyjaśnić: czy masz ścieżkę do pliku w postaci ciągu znaków lub czy masz treść pliku w postaci ciągu i czy chciałbyś, aby została przesłana jako plik? –

+0

@Marko: Czyta tak, jak ma zawartość pliku w ciągu znaków, który dostał z żądania ajax. –

Odpowiedz

13

Musisz ustawić nagłówek Content-type zapytanie do multipart/form-data i bawić się z formatem trochę I wrote this w prostym Ol”JavaScript (tm), ale można łatwo przerobić go do biblioteki:

EDIT: miałem mój kawa teraz, tak zmodyfikowane go do jQuery (nie-library wersja here):

// Define a boundary, I stole this from IE but you can use any string AFAIK 
var boundary = "---------------------------7da24f2e50046"; 
var body = '--' + boundary + '\r\n' 
     // Parameter name is "file" and local filename is "temp.txt" 
     + 'Content-Disposition: form-data; name="file";' 
     + 'filename="temp.txt"\r\n' 
     // Add the file's mime-type 
     + 'Content-type: plain/text\r\n\r\n' 
     // Add your data: 
     + data + '\r\n' 
     + '--'+ boundary + '--'; 

$.ajax({ 
    contentType: "multipart/form-data; boundary="+boundary, 
    data: body, 
    type: "POST", 
    url: "http://asite.com/apage.php", 
    success: function (data, status) { 
    } 
}); 
+1

Mmm, miło! Nie wiedziałem, że było to możliwe w przypadku żądania Ajax. –

+0

@Pekka: Jasne. Poręczny, jeśli nie masz kontroli nad serwerem, do którego przesyłasz, i musi zaakceptować plik tekstowy wysłany z wieloczęściowym/formularzy-danych. –

+4

To zadziałało, oprócz dwóch poprawek do pracy z wyrażeniem/węzłem: 1) ostatnią granicą musi być "+" - "+ granica +" - ";", a także contentType w wywołaniu ajaxowym musi być: ' "multipart/form-data; boundary =" + boundary' – chovy

7

Oto jak to zrobić bez konieczności ręcznego budowy ciała żądania multi-część:

var s = 'some string data'; 
var filename = 'foobar.txt'; 

var formData = new FormData(); 
formData.append('file', new File([new Blob([s])], filename)); 
formData.append('another-form-field', 'some value'); 

$.ajax({ 
    url: '/upload', 
    data: formData, 
    processData: false, 
    contentType: false, 
    type: 'POST', 
    success: function() { 
     console.log('ok'); 
    }, 
    error: function() { 
     console.log('err'); // replace with proper error handling 
    } 
}); 
+0

wydaje mi się ... czy mogę transkodować Base64 do File Object? Jeśli nie, mogę użyć base64 i dekodować go na serwerze. ale jestem po prostu ciekawy – redestructa

+0

Czy obiekt FormData jest zgodny z przeglądarką? –

Powiązane problemy