Return 多个 MemoryStream 作为 HttpResponseMessage
Return multiple MemoryStream as HttpResponseMessage
这个 post 可能是重复的,但我没有在堆栈中找到类似的 post,所以我 post 在这里。
我想 return 列表 MemoryStream
为 HttpResponseMessage
。我在一个文件夹中有多个文件我只想 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 - ./images
。 GetDicomImage
应修改为接受 documents
images
代码并将代码映射到物理路径。
它将阻止客户端请求 "c:\" 文件夹(该文件夹不会被处理但可用于对托管服务进行 DDOS。)
这个 post 可能是重复的,但我没有在堆栈中找到类似的 post,所以我 post 在这里。
我想 return 列表 MemoryStream
为 HttpResponseMessage
。我在一个文件夹中有多个文件我只想 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 - ./images
。 GetDicomImage
应修改为接受 documents
images
代码并将代码映射到物理路径。
它将阻止客户端请求 "c:\" 文件夹(该文件夹不会被处理但可用于对托管服务进行 DDOS。)