【发布时间】:2021-07-14 13:49:55
【问题描述】:
我有一个逻辑应用,它有一个 HTTP POST 请求作为触发器(我还没有为此设置架构或示例有效负载)。然后,逻辑应用会发送一封带有附件的电子邮件,该附件应该是多部分/表单数据上传中的第一项。
来自我的控制台应用程序的代码:
var form = new MultipartFormDataContent();
var bytes = ExcelBuilder.SaveData()
var fileContent = new ByteArrayContent(bytes, 0, bytes.Length);
fileContent.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
fileContent.Headers.Add("Content-Disposition", $"form-data; name=\"test\"; filename=\"test.xlsx\"");
form.Add(fileContent, "test", "test.xlsx")
var response = await httpClient.PostAsync(logicAppUri, form)
我的方法中创建字节数组的代码(使用 ClosedXML):
public byte[] SaveData()
{
IXLWorkbook workbook = new XLWorkbook();
var stream = new MemoryStream();
workbook.SaveAs(stream)
stream.Position = 0;
return stream.ToArray();
}
我尝试过的事情:
- 当我使用硬编码文件路径、调用 workbook.SaveAs(string path),然后调用 File.ReadAllBytes(string path) 时,一切正常。最后将其保存到 ByteArrayContent。我收到一个可读的 Excel 文件作为附件。
- 仅读取 MemoryStream(没有 .ToArray(),并且在返回之前将 Position 设置为 0),将该流传递到 StreamContent 构造函数中,而让其他所有内容保持不变并没有帮助。附件最终仍然无法读取和损坏。
- ClosedXML 在控制台中仍然可以读取流。我可以在我的主课中创建和阅读一个新的工作簿。数据也保持不变。
- 使用 Path.GetTempPath + "test.xlsx" 并在该位置使用 FileStream 也会导致附件损坏。
电子邮件本身发送良好,没有抛出任何错误,逻辑应用程序中的 HTTP Post 输出几乎相同。请求的 $content 部分也不为空,实际上它们具有几乎相同的内容,除了在损坏的版本中有一些不同的字符(例如 $content 是 UAAAAI34IANFJDJF... 在可读运行中,但 UAAAAJ25IANFJFJF ...在不可读的运行中)。附件本身大小相同,名称相同。只是不可读的版本无法在Excel中打开
我不应该在本地保存 Excel 文件,所以我使用的是流。本地保存是我能够做到这一点的唯一方法吗?这是我第一次使用流,所以我怀疑我在那里做错了什么,但我不太确定,我一直陷入死胡同。任何建议将不胜感激!
【问题讨论】:
标签: c# stream httpclient azure-logic-apps