我想使用 Post 上传文件。使用 Postman 时,一切正常,文件按预期上传,但当我尝试使用 RestSharp 时,我的文件始终为空。 我是不是做错了什么?
根据官方文档,一切都是正确的。 https://restsharp.dev/docs/next/usage/request#uploading-files
我在 Stackoverflow 上找到了以下问题,但它有点过时,并且与当前版本的 RestSharp 不匹配。
测试:
[Fact]
public async Task Upload_ShouldWork()
{
//Arrange
await this._fixture.Login();
FileStream stream = File.OpenRead("C:\\Users\\Franz Seidl\\OneDrive\\Bilder\\testImage.png");
//Act
var result = await this._testClass.Upload(stream, 1, true);
//Assert
result.Should().BeTrue();
}
客户:
public async Task<bool> Upload(Stream fileStream, int id, bool force = false)
{
var request = new RestRequest($"{BaseUrl}Upload/{{id}}");
var fileParam = FileParameter.Create("upload",() => fileStream,"upload.png");
request.AddUrlSegment("id", id.ToString());
request.AddQueryParameter("force", force.ToString());
request.AddFile("upload.png", () => fileStream,"upload.png", ContentType.Binary);
var result = await this._client.PostAsync<bool>(request);
return result;
}
后端代码:
[HttpPost("Upload/{id}")]
public async Task<ActionResult<bool>> UploadImage([FromRoute] int id, [FromQuery] bool force=false)
{
try
{
if (Request.ContentLength == 0 && Request.Body != null) throw new ArgumentException("No file provided");
var fileStream = Request.Body;
var result = await this._service.Upload(fileStream,id,force);
return result;
}
catch (ArgumentException e)
{
var errorDTO = this._exceptionHandler.HandleExceptionAndCreateDTO(e);
return this.BadRequest(errorDTO);
}
catch (Exception e)
{
var errorDTO = this._exceptionHandler.HandleExceptionAndCreateDTO(e);
return StatusCode(StatusCodes.Status500InternalServerError, errorDTO);
}
}
我还尝试将请求发送到Postman MockServer,结果如下所示。
每个 Postman 发送请求时的另一个有趣的细节是,Request.ContentLength 是 1444,与 FileStream 的值相同。 但是当使用 RestSharp 发送时,Request.Content 为 1643。 可能是文件编码不正确。
您可以使用
request.Files.Add
添加文件,同时您还可以声明内容长度:
request.Files.Add(
new FileParameter {
ContentLength = 1444,
ContentType = ContentType.Binary,
FileName = "testImage.png",
Name = "attachedFile",
Writer = (s) => {
fileStream.CopyTo(s);
}
}
);