У меня есть код ниже, чтобы нарезать файл и вызывать Web API для каждого фрагмента данных для загрузки. Как я могу включить большой двоичный объект (байты, полученные из file.slice ()) в ajax POST, чтобы я мог получить его как httpRequest.Form.Files [0] на стороне сервера? Спасибо!
function Upload() {
reader = new FileReader();
file = document.querySelector('#file-upload').files[0];
upload_file(0);
}
function upload_file(start) {
var next_slice = start + slice_size + 1;
var blob = file.slice(start, next_slice);
reader.onloadend = function(event) {
if (event.target.readyState !== FileReader.DONE) {
return;
}
//var imageData = new FormData($('#frmFile')[0]);
var imageData = new FormData();
imageData.append("additionalData", "1234567");
$.ajax( {
url: 'http://localhost:58373/AddFileAPI/AddFile',
type: 'POST',
cache: false,
data: imageData,
//data: blob,
contentType: false,
processData: false,
crossDomain: true,
xhrFields: { withCredentials: true },
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR, textStatus, errorThrown);
},
success: function(data) {
var size_done = start + slice_size;
var percent_done = Math.floor((size_done / file.size) * 100);
if (next_slice < file.size) {
// More to upload, call function recursively
upload_file(next_slice);
} else {
alert('Upload complete');
}
}
} );
};
//reader.readAsDataURL(blob);
reader.readAsBinaryString(blob);
}
Ниже представлен API, который считывает байты файла и добавляет его в файл на диске. Требуется FileName и поток файлов.
[HttpPost]
[Route("AddFile")]
public ActionResult AddFile()
{
var request = HttpContext.Request;
var file = request.Form.Files[0];
var inputStream = file.OpenReadStream();
string additionalData = request.Form["additionalData"];
var fullName = Path.Combine(serverPath, Path.GetFileName(file.FileName));
using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write))
{
var buffer = new byte[1024];
var l = inputStream.Read(buffer, 0, 1024);
while (l > 0)
{
fs.Write(buffer, 0, l);
l = inputStream.Read(buffer, 0, 1024);
}
fs.Flush();
fs.Close();
}
}