У меня есть элемент canvas на веб-сайте, который я загружаю с помощью API FormData. Вот как я это делаю:
загрузка: функция (e) { var file = this.imagePreview.ui.canvas.get(0).toDataURL("image/jpeg") .replace('data:image/jpeg;base64,', ''); если (файл) { вар formData = новый FormData (); formData.append('файл', файл); $.ajax({ URL: app.getApiRoot + 'UserFiles/', тип: "пост", данные: данные формы, данные процесса: ложь, Тип контента: ложь, ошибка: функция () { $("#file_upload_result").html('при отправке произошла ошибка'); } }); } } где я заменяю весь бизнес data:image/jpeg;base64, согласно этому сообщению.
На сервере у меня есть следующий составной контроллер:
public async Task PostUserFile() { строка imageDir = ConfigurationManager.AppSettings["UploadedImageDir"]; var PATH = HttpContext.Current.Server.MapPath("~/" + imageDir); var rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty); если (Request.Content.IsMimeMultipartContent()) { варstreamProvider = новый CustomMultipartFormDataStreamProvider(PATH); ждут Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => { если (t.IsFaulted || t.IsCanceled) { выдать новое исключение HttpResponseException(HttpStatusCode.InternalServerError); } var files =streamProvider.FileData.Select(i => { вар информация = новый FileInfo (i.LocalFileName); вернуть новый UserFile(User.Identity.GetUserId(), info.Name, rootUrl + "/" + imageDir + "/" + info.Name, info.Length / 1024); }); db.UserFiles.AddRange(файлы); db.SaveChangesAsync(); }); вернуть ОК(); } еще { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, «Этот запрос отформатирован неправильно»)); } } Где я реализую CustomMultipartFormDataStreamProvider следующим образом:
публичный класс CustomMultipartFormDataStreamProvider: MultipartFormDataStreamProvider { общедоступный CustomMultipartFormDataStreamProvider (строковый путь) : база (путь) { } общедоступная строка переопределения GetLocalFileName (заголовки Headers.HttpContentHeaders) { var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName)? headers.ContentDisposition.FileName : "Без имени"; // Это здесь, потому что Chrome отправляет файлы в кавычках // метки, которые рассматриваются как часть имени файла и экранируются return name.Replace("\"\"", string.Empty); } } К сожалению, FileData в streamProvider, переданном в метод ReadAsMultipartAsync, пуст:

И еще одна интересная вещь: загруженный двоичный файл экранирован, как я заметил в окне просмотра:

%2f — это escape-последовательность для символа /.
Я просто не могу точно определить проблему. У кого-нибудь есть предложения?
Мобильная версия