问题描述
我正在尝试将 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;
}
}
}