Chúc ngày vui vẻ!Cách tải tệp lên máy chủ API Web và gửi tham số cùng với hành động?
Tôi đang làm việc trên dự án ASP.NET Web API 2. Tại một thời điểm nhất định, cần phải tải lên một số tệp. Các tệp cần được liên kết với một FileModel nhất định (lớp riêng của chúng tôi). Vì vậy, khách hàng cần gửi IEnumerable như tham số và các tập tin như nội dung. Bởi vì đó là một RESTful API, cả hai đều phải được gửi trong cùng một yêu cầu.
Điều tốt nhất chúng tôi có thể đưa ra là hành động điều khiển sau:
public async Task<HttpResponseMessage> Add([FromUri] IEnumerable<FileModel> fileModels)
{
// REQUEST INTEGRITY TESTING
var streamProvider = new CustomMultipartFormDataStreamProvider(fileSavePath, fileModels);
// Read the MIME multipart content using the stream provider we just created.
var work = await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(async t =>
{
// SOME WORK DONE AFTER SAVING THE FILES TO THE HARD DRIVE
}
}
Vấn đề là như sau: các tập tin được tải lên với Content-Type tiêu đề một 'multipart/form-data'. Chúng ta cần biết nội dung của FileModels trước khi thao tác các tập tin ở phía máy chủ. Nếu chúng ta sử dụng MultipartFormDataStreamProvider, chúng ta chỉ có thể truy cập các tham số không tập tin sau khi các tập tin đã được lưu vào ổ đĩa cứng.
Cách giải quyết duy nhất cho điều này mà chúng tôi có thể tìm thấy là gửi tham số < FileModel> IEnumerable trong URL. Nhưng với điều kiện URL có độ dài tối đa giới hạn, đây không phải là phương pháp đáng tin cậy.
Câu hỏi đặt ra là: Có cách nào để nộp cả IEnumerable < FileModel> tham số fileModels và các tập tin trong cơ thể của các yêu cầu và được tiếp cận với các thông số fileModels trước khi truy cập các tập tin? Chúng tôi cũng muốn có thể sử dụng HttpContext.Current.Request.Files.Count;
jQuery hiện tại của chúng tôi để tải lên tập tin trông như thế này (cho mục đích thử nghiệm sớm, nó chỉ hỗ trợ một tập tin tải lên):
$('#Upload').click(function(e) {
e.preventDefault();
var headers = new Array();
headers["SessionId"] = sessionId;
var files = $('#fileInput').get(0).files;
var formData = new FormData();
formData.append("files", files[0]);
var fileModel = $('#fileSubmission').serialize();
$.ajax({
url: "api/Submissions/Add/?" + fileModel,
headers: headers,
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false,
dataType: 'json'
});
});
Cảm ơn bạn rất nhiều!
Bạn đã xem là gửi toàn bộ dữ liệu như JSON và chỉ đơn giản là deserializing nó vào một lớp có chứa một 'Stream', và các thông số siêu dữ liệu? –
Có, nhưng Tệp luôn kết thúc bằng không. –
Bạn đã thử sử dụng MultipartFormDataStreamProvider chưa. Nhìn vào mẫu này https://damienbod.wordpress.com/2014/03/28/web-api-file-upload-single-or-multiple-files/ – usp