首页 > 解决方案 > HttpClient、PostAsync、文件上传、文件正文添加边界

问题描述

我是论坛的新手,所以不能直接添加图片。我也不允许添加标签“PostAsync”或“MultipartFormDataContent”。希望网址的工作和帖子有意义!

我在 .NET 控制台应用程序中使用 HttpClient 将文件发布到外部 Web 服务。目前我正在使用一个看起来像这样的虚拟文档(.txt): 原始文档

POST 工作并上传文档,但它已将边界、内容处置和内容类型附加到文档文本: 发布后的文档

代码如下所示:

如果我查看 RequestMessage->Content 标题对我来说看起来不错:Content Header

我的问题是:这与我的 POST 有关,还是与 Web 服务如何处理/接收请求有关?我尝试了 4 种不同的“变体”(几乎完全相同)来执行此 POST,结果相同。我还尝试从边界中删除引号:

var boundaryValue = content.Headers.ContentType.Parameters.FirstOrDefault(p => p.Name == "boundary");

boundaryValue.Value = boundaryValue.Value.Replace("\"", String.Empty); 

任何输入表示赞赏,这一直困扰着我一段时间:)

编辑

        string filePath = @"C:\Development\Customer\PKH\Documaster\TestFileToUpload.txt";
        // we need to send a request with multipart/form-data
        var content = new MultipartFormDataContent();
        var fileContent = new StreamContent(File.OpenRead(filePath));
        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "\"files\"",
            FileName = "\"" + Path.GetFileName(filePath) + "\""
        };
        fileContent.Headers.ContentType = new MediaTypeHeaderValue("plain/text");
        content.Add(fileContent);

        //Create uri
        var builder = new UriBuilder(httpClient.BaseAddress + "integration/hub/v1/upload-single-file");
        var query = HttpUtility.ParseQueryString(builder.Query);
        var fileName = Path.GetFileName(filePath);
        query["file-name"] = fileName;
        builder.Query = query.ToString();
        string url = builder.ToString();

        //Do post
        try
        {
            HttpResponseMessage responseString = await httpClient.PostAsync(url, content);
            var contents = await responseString.Content.ReadAsStringAsync();
            JObject newDocument = JObject.Parse(contents);
            return newDocument;
        }
        catch(Exception)
        {
            return null;
        }

//Eivind

标签: .netfilehttpclient

解决方案


没关系,我最后想出了这个:接收端期望得到一个八位字节流,而不是多格式/数据,所以我只需要将它作为 ByteArray 发送并指定 MediaTypeHeaderValue:

string filePath = @"C:\Development\Customer\PKH\Documaster\TestDocxToUpload.docx";
        var filebytes = File.ReadAllBytes(filePath);

        //Create uri
        var builder = new UriBuilder(httpClient.BaseAddress + "integration/hub/v1/upload-single-file");
        var query = HttpUtility.ParseQueryString(builder.Query);
        var fileName = Path.GetFileName(filePath);
        query["file-name"] = fileName;
        builder.Query = query.ToString();
        string url = builder.ToString();

        //Do post
        try
        {
            using (var content = new ByteArrayContent(filebytes))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                HttpResponseMessage responseString = await httpClient.PostAsync(url, content);
                var contents = await responseString.Content.ReadAsStringAsync();
                JObject newDocument = JObject.Parse(contents);
                return newDocument;
            }


        }
        catch(Exception)
        {
            return null;
        }

//Eivind


推荐阅读