2010-06-10 27 views
9

Sử dụng javascript, tôi có một tệp theo chuỗi (có yêu cầu ajax).Cách tải lên chuỗi dưới dạng tệp với jQuery hoặc khung công tác js khác

Làm cách nào để tải tệp đó lên tệp dưới dạng máy chủ bằng một yêu cầu ajax khác?

+1

Hãy làm rõ: bạn có đường dẫn tệp dưới dạng chuỗi hoặc bạn có nội dung tệp dưới dạng chuỗi và bạn muốn tải lên dưới dạng tệp không? –

+0

@Marko: Nó đọc như anh ta có nội dung tập tin trong một chuỗi, mà anh ta nhận được từ một yêu cầu ajax. –

Trả lời

13

Bạn cần phải đặt tiêu đề Content-type yêu cầu multipart/form-data và chơi xung quanh với các định dạng một chút, I wrote this trong JavaScript Plain Ol'(tm) nhưng bạn có thể dễ dàng làm lại nó cho một thư viện:

EDIT: có tôi cà phê bây giờ, do biến đổi nó cho jQuery (không-thư viện phiên bản 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, đẹp quá! Không biết điều đó là có thể trong một yêu cầu Ajax. –

+0

@Pekka: Chắc chắn rồi. Tiện dụng nếu bạn không có quyền kiểm soát máy chủ mà bạn đang tải lên và nó CÓ chấp nhận một tệp văn bản được đăng với nhiều dữ liệu/biểu mẫu. –

+4

Điều này làm việc, ngoại trừ hai điều chỉnh để làm việc với Express/nút: 1) ranh giới cuối cùng cần phải là '+ '-' + ranh giới + '-';' và cũng là contentType trong cuộc gọi ajax cần phải là: ' "multipart/form-data; boundary =" + boundary' – chovy

7

Dưới đây là làm thế nào để làm điều đó mà không cần tay xây dựng theo yêu cầu cơ thể đa phần:

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

có vẻ tốt đẹp ... tôi có thể chuyển mã Base64 thành một đối tượng tệp không? Nếu không, tôi có thể sử dụng base64 và giải mã nó trên máy chủ. nhưng im chỉ tò mò – redestructa

+0

Có phải đối tượng qua trình duyệt tương thích với FormData không? –

Các vấn đề liên quan