多部分/表单数据请求-上载pdf导致空白文件

史蒂夫·博尼法斯

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

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

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("[email protected]");
                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 RestEase库文档中建议使用这种方法。该扩展方法如下所示:

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编码对我上载的.pdfs中二进制内容进行编码但是,可以正常处理我正在上传的.txt文件。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

多部分表单数据请求无法调用大文件

如何在多部分/表单数据请求中获取文件的实际文件大小

使用 UploadFile 进行直接文件上传,无需多部分/表单数据请求

带有resteasy和多部分/表单数据请求的最大文件大小

尝试通过执行PUT请求的API上传模型时文件丢失-多部分/表单数据请求-Laravel / PHP

在Flask中上传文件,无需多部分/表单数据

AngularJS如何上传多部分表单数据和文件?

使用HTTPWebrequest上传文件(多部分/表单数据)

使用 PowerShell 上传多部分/表单数据文件

如何使用go的net / http或类似方法保存在多部分/表单数据POST请求中收到的文件?

如何在PHP上使用curl发出文件的多部分/表单数据请求和重复键

使用RestSharp上载不包含多部分/表单数据的文件

使用ngx-mat-file-input从Angular上载文件作为多部分/表单数据

使用带有多部分/表单数据的restify发送文件会导致超时问题

如何在提琴手中拦截多部分/表单数据并访问作为请求一部分的二进制文件

请求:发布多部分/表单数据

如何区分空文件和丢失文件的多部分表单数据?

在文件上传中使用curl来处理多部分/表单数据

测试ASP.NET Web API多部分表单数据文件上传

使用curl来发布多部分/表单数据,文件和许多键值对

使用WSO2 API管理器上传多部分表单数据文件?

用于上传文件的Java HTTP客户端(多部分/表单数据)

使用多部分表单数据上传文件时,我缺少什么?

Angular 7将文件内容作为多部分/表单数据发布

文件上传API:主体中的多部分/表单数据与原始内容?

使用HttpClient从流中发布多部分/表单数据文件

无法在iOS中使用NSURLSession多部分表单数据上传文件

PATCH / PUT不接受多部分/表单数据文件上传吗?

覆盖文件不起作用的多部分/表单数据图像