我的目标是将一台服务器中的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] 删除。
我来说两句