[英]Manipulating a stream inside a using statement
我正在處理.NET Core中的上載,這些上載作為IFormFile
傳遞。 在最終傳遞要保存的文件之前,我需要操縱流以除去Exif數據。 但是,我不知道該如何處理。 我正在嘗試下面的代碼,但是它不起作用,因為在using
語句stream
是只讀的。
做這樣的事情的正確方法是什么?
public async Task<IActionResult> UploadImage(IFormFile image)
{
using (var stream = new MemoryStream())
{
// image is IFormFile
await image.CopyToAsync(stream);
// doesn't work, stream is readonly
stream = StripExif(stream);
// save stream
}
return Ok();
}
public static Stream StripExif(Stream stream)
{
stream.Seek(0, SeekOrigin.Begin);
// remove Exif data
return stream;
}
using只是有一個問題,因為您試圖分配給using變量。 您可以在StripExif
創建一個新的MemoryStream
,然后將StripExif
的結果分配給一個新的流變量。
public async Task<IActionResult> UploadImage(IFormFile image)
{
using (var stream = new MemoryStream())
{
// image is IFormFile
await image.CopyToAsync(stream);
var strippedStream = StripExif(stream);
// save strippedStream, not stream.
}
return Ok();
}
public static MemoryStream StripExif(MemoryStream stream)
{
var result = new MemoryStream();
stream.Seek(0, SeekOrigin.Begin);
// remove Exif data from result
return result;
}
更新 :
public async Task<IActionResult> UploadImage(IFormFile image)
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(new MemoryStream())
{
// image is IFormFile
await image.CopyToAsync(stream);
var strippedStream = StripExif(stream, writer);
// save strippedStream, not stream.
}
return Ok();
}
public static void StripExif(MemoryStream stream, StreamWriter writer)
{
// lets assume for sake of example that removing ExIf just removes the
// the first 10 characters of the stream
stream.Seek(10, SeekOrigin.Begin);
writer.Write(stream.ReadToEnd());
}
StripExif
實際上並沒有創建新的Stream
,而是對傳遞給它的Stream
了變異,因此它根本不應該返回Stream
。 然后,當調用方修改該調用以反映它已對該參數進行了更改而不是創建新的流時,問題就消失了:
public async Task<IActionResult> UploadImage(IFormFile image)
{
using (var stream = new MemoryStream())
{
// image is IFormFile
await image.CopyToAsync(stream);
StripExif(stream);
// save stream
}
return Ok();
}
public static void StripExif(Stream stream)
{
stream.Seek(0, SeekOrigin.Begin);
// remove Exif data
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.