Чтение данных HTTP-файла и формы без записи на диск с помощью веб-API - PullRequest
0 голосов
/ 12 октября 2019

Мой вопрос похож на этот: webapi-file-uploading-без записи файлов на диск

Однако этот и большинство других подобных вопросов останавливаются начтение данных файла. Я сделал этот бит работать нормально, но я также хочу прочитать остальные данные формы в форме, которая имеет другие элементы для загрузки, такие как «Заголовок» и т. Д. Это происходит из решения в вышеупомянутом вопросе:

            var filesToReadProvider = await Request.Content.ReadAsMultipartAsync();

filesToReadProvider - это коллекция объектов HTTPContent, поэтому я попытался:

        List<HttpContent> uploadedstuff = filesToReadProvider.Contents.ToList();
        Image image = new Image(); ;        // The image object we will create
        Stream filestream;  // The file stream object to use with the image
        foreach (var thing in uploadedstuff)
        {
            try
            {
                string name = thing.Headers.ContentDisposition.Name.Replace("\"", ""); // String is quoted "\""namestring"\"" so need it stripped out
                List<NameValueHeaderValue> parameters = thing.Headers.ContentDisposition.Parameters.ToList();
                if (name == "file")
                {
                    image.LocalFileName = thing.Headers.ContentDisposition.FileName;
                    filestream = await thing.ReadAsStreamAsync();
                }
                if (name == "Title")
                {
                    // vvv- this line causes an exception.
                    NameValueCollection titleData = await thing.ReadAsFormDataAsync();
                }
            }
            catch (System.Exception e)
            {
                var message = "Something went wrong";
                HttpResponseMessage err = new HttpResponseMessage() { StatusCode = HttpStatusCode.ExpectationFailed, ReasonPhrase = message };
                return ResponseMessage(err);
            }
        }

Есть какие-нибудь идеи, что мне следует сделать, например: данные формы 'Title'? Я чувствую, что я рядом, но, может быть, вы ошибаетесь? Большое спасибо.

1 Ответ

1 голос
/ 12 октября 2019

Теперь, когда он разбирается в комментариях, я опубликую этот ответ, чтобы помочь другим, возможно.

Форма многокомпонентного контента отправляет данные обратно на сервер, как этот "

---------------------------acebdf13572468
Content-Disposition: form-data; name="file"; 
Content-Type: image/*

<@INCLUDE *App.jpg*@>
---------------------------acebdf13572468
Content-Disposition: form-data; name="TextField";
Content-Type: application/octet-stream

Text Value
---------------------------acebdf13572468
Content-Disposition: form-data; name="JsonField";
Content-Type: application/json

{
"Json" : "Object"
}
---------------------------acebdf13572468--

Каждыйчасть, разделенная линией разделителя (т. е. ---------------------------acebdf13572468), представляет собой собственное содержимое, следовательно, составное.

Вы можете отправлять данные в виде json в одном поле, как показано выше, или отправлять текст или что-либо еще. ОбычноБраузеры отправляют каждый элемент управления в отдельной части. Данные такого типа можно прочитать через механизм связывания модели ASP.Net, указав [FromForm] в аргументах контроллера.

Или в этом конкретном случае вы можете прочитать их с помощьюthing.ReadAsStreamAsync(); и thing.ReadAsStringAsync();

- Правка -

Таким образом, вышеупомянутый метод полезен при прямом чтении данных или иным образом не в проектах MVC. Если вы используетеMVC вы можете легко прочитать, как это.

Давайте представим, что у вас есть модель, подобная

public class Model
{
    public string Title { get; set; }
}

, тогда вы бы создали контроллер и действие, подобное этому:

public class MainController : Controller
{
    [HttpPost]
    public async Task<IActionResult> UploadImage([FromForm]Model model)
    {
        var files = Request.Files;
        var title = model.Title
        //And you can save or use files and content at the same time.
    }
}

Обычно это то, что выв сценарии MVC, и если вы используете Razor или Pages на стороне клиента, вам даже не нужно указывать атрибут [FromForm].

Надеюсь, это вам поможет.

Отказ от ответственности. Я написал все это в браузере. Может содержать синтаксис и другие ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...