【问题标题】:Return multiple MemoryStream as HttpResponseMessage返回多个 MemoryStream 作为 HttpResponseMessage
【发布时间】:2023-03-30 09:51:02
【问题描述】:

这篇文章可能是重复的,但我没有在堆栈上找到类似的帖子,所以我在这里发帖。 我想将MemoryStream 的列表返回为HttpResponseMessage。我在一个文件夹中有多个文件,我只想将这些文件作为 HttpResponseMessage 从 web api 返回。

public async Task<HttpResponseMessage> GetDicomImage(string FolderName)
 {
 try
            {


                    var content = new MultipartContent();
                    MemoryStream dataStream = null;
                    filePathInfo = Directory.GetFiles(FolderName);
                    foreach (var dcm in filePathInfo)
                    {
                        var dataBytes = File.ReadAllBytes(dcm);
                        dataStream = new MemoryStream(dataBytes);
                        content.Add(dataStream);
                    }
                    httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK);
                    httpResponseMessage.Content = content;//new StreamContent(dataStream);
                    httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                    //httpResponseMessage.Content.Headers.ContentDisposition.FileName = bookName;
                    httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/dicom");         
            }
            catch (Exception ex)
            {
                return new HttpResponseMessage
                {
                    StatusCode = HttpStatusCode.InternalServerError,
                    Content = new StringContent(ex.Message)
                };
            }
 }

这是我的代码,我不明白它出了什么问题。我没有为不同的文件获取多个 MemoryStream。

【问题讨论】:

  • Http 消息不能有二进制数据。您必须使用转换为 Base64 字符串。我会使用具有二进制模式的 FTP。 FTP 是 HTTP 的子类,用于传输文件。二进制模式下的 FTP 会自动转换为 Base64 字符串。

标签: c# asp.net-web-api memorystream


【解决方案1】:

您可以使用来自Newtonsoft.Json 包的JsonConvert.SerializeObject 处理它,如下所示:

{
    public async Task<HttpResponseMessage> GetDicomImage(string FolderName)
    {
        var content = new MultipartContent();
        var filePathInfo = Directory.GetFiles(FolderName);
        var files = new List<FileData>();
        foreach (var dcm in filePathInfo)
        {
            var fileData = new FileData { Content = File.ReadAllBytes(dcm), Name = Path.GetFileName(dcm) };
            files.Add(fileData);
        }
        content.files = files.ToArray();
        var str = JsonConvert.SerializeObject(content);
        httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK, str);

    }
}

public class MultipartContent
{
    public FileData[] files;
}

public class FileData
{
    public byte[] Content;
    public string Name;
}

但是不需要返回流。返回byte[] 和文件名就足够了(以便以后保存文件)

然后您需要读取客户端上的响应内容并将其反序列化回 MultipartContent 实例

PS 似乎您正在尝试将文件从主机发送到客户端。 这是不安全的,因为客户端定义了用于从中获取文件的路径。即使托管进程没有读取系统文件的权限,它看起来也存在安全风险。 可能您可以为要在主机端映射的文件夹定义某些代码。 喜欢documents - ./documentsimages - ./imagesGetDicomImage 应修改为接受 documents images 代码并将代码映射到物理路径。 它将阻止客户端请求“c:\”文件夹(不会被处理但可用于 DDOS 托管服务。)

【讨论】:

  • 感谢您的回复。有好的建议写在帖子里。我在这里收到错误 httpResponseMessage.Content = JsonConvert.SerializeObject(content); “无法将类型字符串隐式转换为 Httpcontent”,所以我更改了这样的代码 httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK, content);这是对还是错?
  • @Pritish 是的,很好,谢谢。我会更新答案
  • 一个问题如何发送多个内存流对象。在 HttpResponseMessage
  • @Pritish 实际上,您应该考虑如何在一个响应中发送多个字节数组。我引入了MultipartContent 类来保存多个文件的多个字节数组。然后使用 JsonConvert.SerializeObject 序列化对象,将多个文件转换为响应。遗憾的是,无法将 MemoryStream 对象与 http 响应一起发送
猜你喜欢
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多