尝试将 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;
        }

    }
}