2010-06-10 52 views
9

使用JavaScript,我有一個字符串文件(與Ajax請求得到)。如何上傳字符串作爲文件與jQuery或其他js框架

如何通過另一個Ajax請求上傳的文件服務器?

+1

請澄清一下:你是否有文件路徑作爲字符串,或者你有文件內容作爲字符串,你想它作爲文件上傳? – 2010-06-10 07:54:20

+0

@Marko:它看起來像他有一個字符串中的文件內容,他從ajax請求中獲得。 – 2010-06-10 08:01:24

回答

13

您需要將Content-type請求頭設置爲multipart/form-data和玩的純醇」的JavaScript(TM)格式的一點,I wrote this但你可以很容易地返工爲圖書館:

編輯:有我咖啡了,所以修改了它的jQuery(無庫版本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

嗯,真好!不知道這在Ajax請求中是可能的。 – 2010-06-10 08:00:39

+0

@Pekka:好的。如果您無法控制要上傳的服務器,並且必須接受使用多部分/表單數據發佈的文本文件,方便使用。 – 2010-06-10 08:16:27

+4

這有效,除了使用express/node進行兩次調整外:1)最後一個邊界需要是'+' - '+ boundary +' - ';'並且ajax調用中的contentType必須是:'' 「multipart/form-data; boundary =」+ boundary' – chovy 2013-01-24 23:35:19

7

這裏是如何做到這一點,而無需手動建立多部分請求主體:

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

似乎很好...我可以將Base64轉碼爲文件對​​象嗎?如果沒有,我可以使用base64並在服務器上解碼它。但我只是好奇 – redestructa 2016-09-06 08:53:02

+0

FormData對象跨瀏覽器兼容? – 2016-10-05 04:41:14

相關問題