Как на самом деле работает ReadAsMultipartAsync?C#

Место общения программистов C#
Ответить
Anonymous
 Как на самом деле работает ReadAsMultipartAsync?

Сообщение Anonymous »

У меня есть элемент Canvas на веб-сайте, который я загружаю с помощью API FormData. Вот как я это делаю:

Код: Выделить всё

upload: function (e) {
var file = this.imagePreview.ui.canvas.get(0).toDataURL("image/jpeg")
.replace('data:image/jpeg;base64,', '');
if (file) {
var formData = new FormData();
formData.append('file', file);
$.ajax({
url: app.getApiRoot + 'UserFiles/',
type: "post",
data: formData,
processData: false,
contentType: false,
error: function () {
$("#file_upload_result").html('there was an error while submitting');
}
});
}
}
где я заменяю все данные:image/jpeg;base64, бизнес согласно этому сообщению.

На сервере у меня есть следующий составной контроллер:

Код: Выделить всё

public async Task PostUserFile()
{
string imageDir = ConfigurationManager.AppSettings["UploadedImageDir"];
var PATH = HttpContext.Current.Server.MapPath("~/" + imageDir);
var rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty);

if (Request.Content.IsMimeMultipartContent())
{
var streamProvider = new CustomMultipartFormDataStreamProvider(PATH);
await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}

var files = streamProvider.FileData.Select(i =>
{
var info = new FileInfo(i.LocalFileName);
return new UserFile(User.Identity.GetUserId(), info.Name, rootUrl + "/" + imageDir + "/" + info.Name, info.Length / 1024);
});

db.UserFiles.AddRange(files);
db.SaveChangesAsync();
});

return Ok();
}
else
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
}
}
Где я реализую CustomMultipartFormDataStreamProvider следующим образом:

Код: Выделить всё

public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path)
: base(path)
{ }

public override string GetLocalFileName(Headers.HttpContentHeaders headers)
{
var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ?
headers.ContentDisposition.FileName :
"NoName";
// This is here because Chrome submits files in quotation
// marks which get treated as part of the filename and get escaped
return name.Replace("\"\"", string.Empty);
}
}
К сожалению, FileData вstreamProvider, переданный в метод ReadAsMultipartAsync, пуст:

Изображение


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

Изображение


%2f — это escape-последовательность для символа / .

Я просто не могу точно определить проблему. У кого-нибудь есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/390 ... ually-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»