我的目标是将 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/