微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试将 base64String 转换为 IFormFile 在 C# 中引发 SystemInvalidOperation 异常

如何解决尝试将 base64String 转换为 IFormFile 在 C# 中引发 SystemInvalidOperation 异常

我正在尝试将 base64String 列表转换为 IFormFile 列表。当我尝试 MemoryStream stream = new MemoryStream(bytes) 时,我得到了一个 stream.ReadTimeout SystemInvalidOperation。那么为什么它不起作用?

这是我的代码

private async Task<List<IFormFile>> Base64ToImage(List<EquipmentFile> equipmentFiles)
{
    List<IFormFile> formFiles = new List<IFormFile>();
    foreach (var eqp in equipmentFiles)
    {
      byte[] bytes = Convert.FromBase64String(eqp.File);
      MemoryStream stream = new MemoryStream(bytes);
      IFormFile file = new FormFile(stream,bytes.Length,eqp.Name,eqp.Name);
      formFiles.Add(file);
    }
    return formFiles;
}
 

我的堆栈跟踪:

system.invalidOperationException: Timeouts are not supported on this stream.
   at System.IO.Stream.get_ReadTimeout()
   at FieldService.CallCenter.Api.Controllers.EquipmentLibraryController.Base64ToImage(List`1 equipmentFiles) in C:\Users\CMTech-DEV\Documents\cmtech\fieldservice-api\src\CallCenter\FieldService.CallCenter.API\Controllers\EquipmentLibraryController.cs:line 331
   at System.IO.Stream.get_ReadTimeout()
   at FieldService.CallCenter.Api.Controllers.EquipmentLibraryController.Base64ToImage(List`1 equipmentFiles) in C:\Users\CMTech-DEV\Documents\cmtech\fieldservice-api\src\CallCenter\FieldService.CallCenter.API\Controllers\EquipmentLibraryController.cs:line 331

解决方法

在将 Dispose 传递给 MemoryStream 构造函数后,由于 FormFile 块,您在 using 上隐式调用 FormFile。然后返回一个 FormFile 对象列表,其中所有内部流都处理

Stream.Read 不会复制流的内容,而是(通过 ReferencedReadStream)调用 MemoryStream 之类的方法(至少在 Dispose 的情况下)将 throw an exception if the stream has been closed--由于 using

您尚未提供任何信息(例如堆栈跟踪),因此这是一个最佳猜测,但删除 private List<IFormFile> Base64ToImage(List<EquipmentFile> equipmentFiles) { List<IFormFile> formFiles = new List<IFormFile>(); foreach (var eqp in equipmentFiles) { byte[] bytes = Convert.FromBase64String(eqp.File); MemoryStream stream = new MemoryStream(bytes); IFormFile file = new FormFile(stream,bytes.Length,eqp.Name,eqp.Name); formFiles.Add(file); } return formFiles; } 应该足以解决此问题。

package com.example.dashboard;

import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    public CardView draftCard,cardsCard,todoCard,moneyCard,linkedinCard;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);

        //definingcards
        draftCard = findViewById(R.id.draftCard);
        cardsCard = findViewById(R.id.cardsCard);
        moneyCard = findViewById(R.id.moneyCard);
        todoCard = findViewById(R.id.todoCard);
        linkedinCard = findViewById(R.id.linkedinCard);

        //addingclicklistener
        draftCard.setOnClickListener(this);
        cardsCard.setOnClickListener(this);
        moneyCard.setOnClickListener(this);
        todoCard.setOnClickListener(this);
        linkedinCard.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        Intent i = getIntent();

        switch (v.getId()) {
            case R.id.draftCard:
                new Intent(this,draftcard.class);
                startActivity(i);
                break;
            case R.id.cardsCard:
                new Intent(this,cardscard.class);
                startActivity(i);
                break;
            case R.id.moneyCard:
                new Intent(this,moneycard.class);
                startActivity(i);
                break;
            case R.id.todoCard:
                new Intent(this,todocard.class);
                startActivity(i);
                break;
            case R.id.linkedinCard:
                new Intent(this,linkedincard.class);
                startActivity(i);
                break;
            default:break;
        }

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。