c# - 多部分/表单数据请求——上传 pdf 导致生成空白文件

标签 c# http asp.net-core .net-core multipartform-data

我的目标是将 pdf 文件从一台服务器发送到处理某些归档的 REST API。我正在使用 .NET Core 3.1 和 RestEase API library帮助进行一些抽象。

我有一个简单的控制台应用程序,每天在特定时间运行。相关代码如下:

using System;
using System.Linq;
using System.Threading.Tasks;
using RestEase;

namespace CandidateUploadFile
{
    class Program
    {
        static async Task Main(string[] args)
        {
            try
            {
                var apiClientBuilder = new ApiClientBuilder<ITestApi>();
                var api = apiClientBuilder.GetApi("https://my.api.com");
                var candidate = await api.GetCandidateByEmailAddress("tester@aol.com");
                var fileName = "tester.pdf";
                var fileBytesToUpload = await FileHelper.GetBytesFromFile($@"./{fileName}");
                var result = await api.UploadCandidateFileAsync(fileBytesToUpload, candidate.Data.First().Id, fileName);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e);
            }
        }
    }
}

apiClientBuilder 添加了一些 auth-header,仅此而已。我确定那一点不相关。

ITestApi 看起来像这样:

using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Models;
using RestEase;

namespace CandidateUploadFile
{
    public interface ITestApi : IApi
    {
        [Get("v1/candidates/{candidateId}")]
        Task<Models.Response<Candidate>> GetCandidate([Path] string candidateId);

        [Get("v1/candidates")]
        Task<Models.Response<IEnumerable<Candidate>>> GetCandidateByEmailAddress([Query] string email);

        [Get("v1/candidates")]
        Task<Models.Response<IEnumerable<Candidate>>> GetCandidates();

        [Post("v1/candidates/{candidateId}/files?perform_as=327d4d21-5cb0-4bc7-95f5-ae43aabc2db7")]
        Task<string> UploadFileAsync([Path] string candidateId, [Body] HttpContent content);

        [Get("v1/users")]
        Task<Models.Response<IEnumerable<User>>> GetUsers();
    }
}

这里真正相关的是 UploadFileAsync

您会从 Program.Main 中注意到我没有显式调用 UploadFileAsync。我改为调用一个扩展方法,该方法基本上包装 UploadFileAsync 以使用 multipart/form-data 请求上传 pdf。 This approach is what comes as a recommendation in the RestEase library docs. .该扩展方法如下所示:

using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace CandidateUploadFile
{
    public static class ApiExtension
    {
        public static async Task<string> UploadCandidateFileAsync(this ITestApi api, byte[] data, string candidateId, string fileName)
        {
            var content = new MultipartFormDataContent();

            var fileContent = new ByteArrayContent(data);
            fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
            fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "file",
                FileName = fileName
            };

            content.Add(fileContent);

            return await api.UploadFileAsync(candidateId, content);
        }
    }
}

所以当我的控制台应用程序执行时会发生什么:我将从上传端点获得成功响应,并且存档服务器上的文件已创建,但它是空白的。

当我发送一个 .txt 文件时,知道这不会可能很重要。 .txt 文件将保存预期的内容。

任何见解都会有所帮助。我不确定从哪里开始。

谢谢!

最佳答案

问题是由于我在 GetBytesFromFile 静态帮助器方法中所做的。

我的静态助手使用 UTF-8 编码对我上传的 .pdf 中的二进制 内容进行编码。但是,它可以正常处理我上传的 .txt 文件,这是意料之中的。

经验教训:没有必要——也没有意义——在将二进制内容分配给多部分/表单数据内容之前尝试对其进行编码。我只需要按原样“传递”二进制内容,或多或少。

关于c# - 多部分/表单数据请求——上传 pdf 导致生成空白文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61957396/

相关文章:

c# - 如何删除 MS LUIS 帐户并使用同一帐户重新创建

java - Java 无法理解 C# 字节数组

http - 在 Go 中高效处理许多大文件的 HTTP 上传

c# - 如何在 asp.net 中将参数添加到操作过滤器?

c# - 在 C# 中缩放窗口窗体

c# - Unity 5 音频音量 slider

Android使用HTTP多部分表单数据上传视频到远程服务器

java - 如何在 Java 的 post 请求中添加 cookie?

.net - (TTFB) 某些特定请求花费的时间比执行实际请求的时间长

c# - 调用 System.IO.StreamReader 时转义字符格式错误