如何解决尝试将 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 举报,一经查实,本站将立刻删除。