我有一个简单的http server人们上传文件,我只是将它们压缩并保存到磁盘上。这就是我正在做的事情,我认为人们会更好地理解代码
/// <summary>
/// Client uploads files through here
/// </summary>
private static void Server_ProcessRequest(HttpListenerContext context)
{
// I know that context.Request.InputStream starts like: ------WebKitFormBoundaryePkpFF7tjBAqx29L
// and it also ends with that boundary
// 1. I read from context.Request.InputStream and skip the headers
// (I read until I find 4 new lines)
// 2. I then write the file to disk
// var sizeOfFile = context.Request.ContentLength64;
// etc... read from stream
// 3. create a new stream in order to compress file later
var newStream = System.IO.File.Open("FileJustCreated");
// 4. MySealedLibraryThatICannotModify.CompressFile(newStream,"CompressedFileLocation.zip");
}
所以我在这里的问题是如何避免将文件写入磁盘?我无法将context.Request.InputStream
传递给压缩文件的方法,因为它包含标题和其他内容不属于文件的一部分。如果我可以创建一个返回新流的方法,那将会很棒。 文件可能很大,我不想把所有东西都放在内存,所以我想创建一个类似System.IO.File.OpenRead
的方法,它返回一个流,其中只有您读取的部分是在记忆中。
我知道我可以使用不同的库来压缩文件,但如果我坚持使用这个库并学习新东西,那将会很不错。
答案 0 :(得分:0)
您可以写入内存而不是文件:
using (var buffer = new MemoryStream())
{
context.Request.InputStream.CopyTo(buffer, sizeOfFile);
MySealedLibraryThatICannotModify.CompressFile(buffer, path);
}