簡體   English   中英

在using語句中處理流

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM