2016-12-08 12 views
2

Я пытаюсь загрузить файл с содержимым тела. Есть PostMultipartAsync единственный способ?Как загрузить файл и сформировать данные с помощью Flurl?

На мой C# код серверной я это:

var resource = FormBind<StorageFileResource>(); 
var file = Request.Files.First().ToPostedFile(); 

FormBind считывает данные из запроса и заполняет объект.

Используя PostMultipartAsync Я знаю, он должен начать так:

.PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)}), но я не могу понять, как добавить объект. У вас есть идеи по этому поводу?

Это моя текущая попытка:

public static async Task<T> PostFileAsync<T>(string url, object data, string name, Stream stream, object queryString = null) 
    where T : class 
{ 
    return await HandleRequest(async() => queryString != null 
     ? await url 
      .SetQueryParams(queryString) 
      .SetClaimsToken() 
      .PostMultipartAsync((mp) => { mp.AddFile(name, stream, name)}) 
      .ReceiveJson<T>() 
     : await url 
      .SetClaimsToken() 
      .PostMultipartAsync((mp) => mp.AddFile(name, stream, name)) 
      .ReceiveJson<T>()); 
} 

Текущий запрос делается на переднем конце:

enter image description here

+0

ли 'ToPostedFile' возвращал [System.Web.HttpPostedFile] (https://msdn.microsoft .com/EN-US/библиотека/system.web.httppostedfile.aspx)? Кроме того, что такое «ресурс» и как он здесь имеет значение? 'файл' должен содержать все, что вы хотите опубликовать, нет? –

+0

Кроме того, в отношении «это единственный способ» загрузить файл с Flurl: Технически нет, но API или веб-сервис, который вы вызываете, должен определять формат, который он требует, будь то «multipart/form-data» или что-то еще , Это важная часть, чтобы узнать в первую очередь. –

+0

@ToddMenier Привет Тодд, в отношении первого вопроса, нет, это локальный класс. Я читал из списка «HttpFile». Ресурс - это мой класс ViewModel, я привязываю только поля запроса к этому классу, цель здесь - показать, что я читаю другие поля отдельно. Что касается 3-й части, это API, который требует «multipart/form-data», пожалуйста, проверьте мой обновленный ответ, чтобы узнать, как это делается сегодня, используя интерфейс. – eestein

ответ

4

Есть множество способов, чтобы добавить «часть» в многочастный POST с Flurl. Я не добавил это к docs еще, но вот пример из issue, что в основном демонстрирует все возможности:

var resp = await "http://api.com" 
    .PostMultipartAsync(mp => mp 
     .AddString("name", "hello!")    // individual string 
     .AddStringParts(new {a = 1, b = 2})   // multiple strings 
     .AddFile("file1", path1)     // local file path 
     .AddFile("file2", stream, "foo.txt")  // file stream 
     .AddJson("json", new { foo = "x" })   // json 
     .AddUrlEncoded("urlEnc", new { bar = "y" }) // URL-encoded      
     .Add(content));        // any HttpContent 
+0

Спасибо! Я должен был использовать 'AddJson' для каждого свойства, так как он мне нужен в теле запроса формы, используя только« AddJson («json», data) », объект сериализуется внутри свойства json внутри свойства Form. Спасибо :) – eestein

+0

'AddStringParts' решил это! :) – eestein

+0

Я пытаюсь отправить вложенные свойства методом 'AddStringParts', но он генерирует' dynamic.ToString() ', что является недопустимым json. Мне просто нужно только сгладить вложенные свойства, разделив точки. 'new {User = new {Name =" Ahmed "}}' => 'User.Name =" Ahmed "' – guneysus