Как отправить файл с http - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь с клиента .net загрузить файл через сервер .net (файл находится на сервере), используя StreamContent. Однако при запуске запроса я получаю исключение:

Исключение

Stream does not support reading.

Клиент

class Program {
        static async Task Main(string[] args) {
            HttpClient client = new HttpClient();
            using (FileStream stream = new FileStream("txt.path", FileMode.OpenOrCreate, FileAccess.Write)) {
                var content = new StreamContent(stream);
                var response = await client.PostAsync("http://localhost:5300/get", content);
            }
        }
    }

Сервер

  public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
            if (env.IsDevelopment()) {
                app.UseDeveloperExceptionPage();
            }
            string fname = "dld.txt";

            app.Run(async (context) => {
                if (!(context.Request.Path == "get")) {
                    return;
                }
                File.WriteAllText(fname, "data is:" + DateTime.Now.ToString());

                FileStream fs = new FileStream(fname, FileMode.Open, FileAccess.Read);
                using (Stream stream = context.Response.Body) {
                    await fs.CopyToAsync(stream);
                }

            });
        }

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

У меня были проблемы с получением файла, потому что я хотел использовать поток Request.Body в качестве приемника. Я хотел, чтобы server записывал данные в этот поток (я думал, что поток Request можно использовать в обоих направлениях).

Я решил это, используя вместо этого поток Response:

Клиент

static async Task Main(string[] args) {
            HttpClient client = new HttpClient();
            using (FileStream stream = new FileStream("data.txt", FileMode.OpenOrCreate, FileAccess.Write)) {
                var content = new StringContent("not important");
                var response = await client.PostAsync("http://localhost:5300/get",content);
                await response.Content.CopyToAsync(stream);
            }
        }
0 голосов
/ 13 февраля 2019

Привет, вы можете использовать как это:

HttpContent stringContent = new StringContent(paramString); //if you want to use string
HttpContent fileStreamContent = new StreamContent(paramFileStream); //if you want to use  file stream
HttpContent bytesContent = new ByteArrayContent(paramFileBytes);// if you want to use aray of bytes
using (var client = new HttpClient())
{
    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(stringContent, "param", "param");
        formData.Add(fileStreamContent, "file", "file");
        formData.Add(bytesContent, "file", "file");
        var response = await client.PostAsync("some URL", formData);
        if (!response.IsSuccessStatusCode)
        {
            return null;
        }
        return await response.Content.ReadAsStreamAsync();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...