gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:28:13 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com