2013-07-18 26 views
5

Tôi có biểu mẫu với một số yếu tố đầu vào và trường khác.jQuery ajax, gửi biểu mẫu với tệp loại đầu vào và Json

Tôi có một nút lưu, và khi tôi nhấp vào, tôi gửi mẫu với ajax với jQuery:

$.ajax({ 
     type:  "POST", 
     dataType: "json", 
     url:  $('#ajaxUrl').val(), 
     data:  "action=save&" + form.serialize() 
}); 

Vì vậy, khi tôi chỉ có đầu vào đơn giản như văn bản, chọn vv .. đó là ok. Nhưng nếu tôi có một tệp kiểu đầu vào, tôi không thể truy xuất tệp của mình. $ _FILES luôn trống.

Tôi có thể làm điều đó đơn giản nhất có thể bằng cách nào?

Chỉnh sửa: Tôi không muốn sử dụng một plugin :)

+0

Sử dụng [formData] (https://developer.mozilla.org/en-US/docs/Web/API/FormData)! – adeneo

+3

có thể trùng lặp của [Làm cách nào để tải lên tệp không đồng bộ với jQuery?] (Http://stackoverflow.com/questions/166221/how-can-i-upload-files-asynchronously-with-jquery) – Martijn

+0

@ Clément Andraud, chứ không phải chắc chắn, cho dù điều này sẽ giúp bạn ra hay không, nhưng xin vui lòng có một cái nhìn tại http: //wordpress.stackexchange.com/questions/71170/how-do-i-upload-nhập-form-input-files-via-ajax-chức năng Bạn có thể nhận được một số ý tưởng. –

Trả lời

0

Tôi đã sử dụng jQuery plugin này trong đó có khả năng để upload files.

HTML:

<form action="file-echo2.php" method="post" enctype="multipart/form-data"> 
    <input type="file" name="myfile"><br> 
    <input type="submit" value="Upload File to Server"> 
</form> 

Javascrtipt:

$('form').ajaxForm({ 
    beforeSend: function() { 

    }, 
    uploadProgress: function(event, position, total, percentComplete) { 

    }, 
    success: function() { 

    }, 
    complete: function(xhr) { 

    } 
}); 
+1

Tôi sẽ làm cùng một nhận xét cho câu trả lời của streetpc +1 –

1

form.serialize không quản lý đầu vào tập tin. Bạn sẽ phải có một XMLHttpRequest với formData như adeneo gợi ý, xem example usage here. Đối với các trình duyệt cũ hơn, có các giải pháp sử dụng iframe và POST biểu mẫu với iframe làm mục tiêu. Một số plugin jquery sẽ làm tất cả những gì cho bạn, như, nói, JQuery-File-Upload (nhưng nhiều người khác tồn tại).

+0

Hỗ trợ cho formData bắt đầu trong IE10, đó là lý do tại sao tôi cũng đề xuất sử dụng plugin sử dụng khung nội tuyến để hỗ trợ trình duyệt cũ hơn. +1 –

+0

Hum, vấn đề của tôi, tôi làm việc trên CMS tùy chỉnh. Chức năng lưu một nội dung mới đã được viết .. Vì vậy, nếu tôi chỉ có thể chỉnh sửa tập lệnh này và không viết lại tất cả ... ^^ –

+0

Vâng, nếu bạn có thể thả hỗ trợ của các trình duyệt cũ hơn, bạn chỉ có thể chỉnh sửa tập lệnh của mình để sử dụng formData. Nếu bạn không thể (thả IE 8 & 9 là khá mạnh), tôi sợ rằng bạn sẽ phải đi xa hơn một chút. Nhưng một số bổ sung sẽ làm tất cả các công việc nặng nhọc, vì vậy nó không quá phức tạp. –

0

Tôi đã tìm thấy điều này little "vanilla" framework bằng cách truy vấn "Sử dụng đối tượng FormData" trên google.

sử dụng bởi:

AJAXSubmit(myForm); 

chỉ sửa đổi trên

function ajaxSuccess(){/*here*/} 

nếu bạn console.log() các phản ứng trên ajaxSuccess bạn có thể xem dữ liệu gửi đến máy chủ. Nó nằm trên tài sản submittedData.

3

thực hiện cho ASP.NET MVC:

Để bắt đầu kiếm của bạn hình thức-wrapper:

<form id="inputform"> 
    <input class="hide" type="file" name="file" id="file" /> 
</form> 

Сreate một client-handler để gửi:

$("#yourButton").bind('click', function() { 
    var data = new window.FormData($('#inputform')[0]); 
    $.ajax({ 
     xhr: function() { 
      return $.ajaxSettings.xhr(); 
     }, 
     type: "POST", 
     data: data, 
     cache: false, 
     contentType: false, 
     processData: false, 
     url: "@Url.Action("MethodName", "ControllerName")", 
     success: function() { }, 
     error: function() { }, 
    }); 
}); 

Đỗ xử lý trên máy chủ bên (bộ điều khiển):

public ActionResult MethodName(HttpPostedFileWrapper file) { 
    var img = Image.FromStream(file.InputStream); 
     .... 
     return ..; 
    } 

Tôi hy vọng điều này sẽ giúp bạn tiết kiệm thời gian;)

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