Return 多个 MemoryStream 作为 HttpResponseMessage

Return multiple MemoryStream as HttpResponseMessage

这个 post 可能是重复的,但我没有在堆栈中找到类似的 post,所以我 post 在这里。 我想 return 列表 MemoryStreamHttpResponseMessage。我在一个文件夹中有多个文件我只想 return 这些文件作为 HttpResponseMessage 来自网络 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。

您可以使用 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;
}

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

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

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