Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在using语句中操作流_C#_Stream_Asp.net Core_.net Core - Fatal编程技术网

C# 在using语句中操作流

C# 在using语句中操作流,c#,stream,asp.net-core,.net-core,C#,Stream,Asp.net Core,.net Core,我正在处理.NETCore中的上载,这些上载作为。在最终传递要保存的文件之前,我需要操作流以删除Exif数据。然而,我不知道如何处理这件事。我正在尝试下面的代码,但它不起作用,因为stream在using语句中是只读的 这样做的正确方法是什么 public async Task<IActionResult> UploadImage(IFormFile image) { using (var stream = new MemoryStream()) {

我正在处理.NETCore中的上载,这些上载作为。在最终传递要保存的文件之前,我需要操作流以删除Exif数据。然而,我不知道如何处理这件事。我正在尝试下面的代码,但它不起作用,因为
stream
using
语句中是只读的

这样做的正确方法是什么

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;
}
公共异步任务上载映像(IFormFile映像)
{
使用(var stream=new MemoryStream())
{
//图像是一个文件
等待映像。复制到同步(流);
//不工作,流是只读的
流=StripExif(流);
//存储流
}
返回Ok();
}
公共静态流StripExif(流)
{
stream.Seek(0,SeekOrigin.Begin);
//删除Exif数据
回流;
}

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;
}
公共异步任务上载映像(IFormFile映像)
{
使用(var stream=new MemoryStream())
{
//图像是一个文件
等待映像。复制到同步(流);
var strippedStream=StripExif(流);
//保存strippedStream,而不是stream。
}
返回Ok();
}
公共静态MemoryStream StripExif(MemoryStream流)
{
var结果=新的MemoryStream();
stream.Seek(0,SeekOrigin.Begin);
//从结果中删除Exif数据
返回结果;
}
更新:

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());        
}
公共异步任务上载映像(IFormFile映像)
{
使用(var stream=new MemoryStream())
使用(var writer=newstreamwriter(new MemoryStream())
{
//图像是一个文件
等待映像。复制到同步(流);
var strippedStream=StripExif(流,写入程序);
//保存strippedStream,而不是stream。
}
返回Ok();
}
公共静态void StripExif(MemoryStream流、StreamWriter)
{
//为了举例,让我们假设删除ExIf只会删除
//流的前10个字符
stream.Seek(10,SeekOrigin.Begin);
writer.Write(stream.ReadToEnd());
}

StripExif
实际上并没有创建新的
,而是对传递给它的
进行了变异,因此它根本不应该返回
。当调用方修改调用以反映它变异了参数,而不是创建了新的流时,问题就消失了:

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
}
公共异步任务上载映像(IFormFile映像)
{
使用(var stream=new MemoryStream())
{
//图像是一个文件
等待映像。复制到同步(流);
StripExif(流);
//存储流
}
返回Ok();
}
公共静态void StripExif(流)
{
stream.Seek(0,SeekOrigin.Begin);
//删除Exif数据
}

史蒂夫,谢谢你的排版修正。:)这是否违背了使用语句的目的?如果我正在创建一个新的流,它仍然需要被处理,不是吗?它并没有违背这个目的,因为在处理流之前需要从iFormFile中检索它。是的,您是正确的,返回的流仍然需要处理,但必须通过手动关闭流在UploadImage中处理。另一个选项是创建一个StreamWriter,它被传递到StripExif(我将添加一些代码)更新后的
StripExif
返回void,但返回值在
UploadImage
中被引用,不确定它应该是什么。我尝试过,但在我这样做时,流本身没有被操纵。不确定Exif剥离本身是否有问题,或者流是否没有被更改,我将不得不处理它。@vaindil在您显示的代码中,返回的是同一个流,因此返回它没有意义。如果您实际上是在创建一个新流,而不是简单地修改提供的流,那么这与您提供的示例不同。图像库正在正确处理代码。我不知道我是否在主函数中错误地处理了流,但它没有被触及。@vaindil那么您显示的代码并不是您实际问题的代表性示例。您显示的代码是传入的流,是返回的流。这是正确的,它完全是从我的代码中复制的,但是删除了无关的内容。我无法让它与我的方法或目前关于这个问题的两个答案一起工作,所以目前我已经将StripExif代码移到UploadImage代码中。这样做是正确的。