C# FormFile复制到memorystream ObjectDisposedException
我目前正在使用tinyMCE为一个网站创建一些新闻帖子。 我需要能够上传图像,但我遇到了一个障碍 当我按下控制器时,我得到一个C# FormFile复制到memorystream ObjectDisposedException,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我目前正在使用tinyMCE为一个网站创建一些新闻帖子。 我需要能够上传图像,但我遇到了一个障碍 当我按下控制器时,我得到一个 System.ObjectDisposedException: Cannot access a disposed object. Object name: 'FileBufferingReadStream'. at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ThrowIfDisposed()
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'FileBufferingReadStream'.
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ThrowIfDisposed()
at Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.set_Position(Int64 value)
at Microsoft.AspNetCore.Http.Internal.ReferenceReadStream..ctor(Stream inner, Int64 offset, Int64 length)
at Microsoft.AspNetCore.Http.Internal.FormFile.OpenReadStream()
at Microsoft.AspNetCore.Http.Internal.FormFile.CopyToAsync(Stream target, CancellationToken cancellationToken)
at HardwareOnlineDk.Web.Areas.Admin.Controllers.ImageController.Upload(IFormFile inputFile) in D:\Kode\HardwareOnlineRider\HOL\SourceCode\Main\Web\Areas\Admin\Controllers\ImageController.cs:line 139
我的代码如下所示:
[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload(IFormFile inputFile)
{
try
{
var filesCount = Request.Form.Files.Count;
if (filesCount == 0)
return BadRequest("Ingen fil fundet");
// Get HTTP posted file based on the fieldname.
var file = Request.Form.Files.GetFile("file");
if (file == null)
return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");
// Check if the file is valid.
if (!Check(file.FileName, file.ContentType))
return BadRequest("Fil ikke gyldig");
var memoryStream = new MemoryStream();
await file.CopyToAsync(memoryStream);
var medie = new Medie
{
Name = file.FileName.Trim('\"'),
ParentId = _imageService.TempFolderGuid,
ContentLength = file.Length,
Content = memoryStream.ToArray()
};
try
{
var imageId = await _imageService.Medier_InsertMedie(medie);
//TODO Her skal vi gemme ImageId i Session
return Json(new
{
location = $"/api/media/{imageId.Id}.jpg"
});
}
catch
{
return BadRequest("Kunne ikke gemme billede");
}
}
catch
{
return StatusCode(500);
}
}
[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload([FromForm]IFormFile file)
{
try
{
if (file == null)
return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");
var memoryStream = new MemoryStream();
await file.CopyToAsync(memoryStream);
var filesCount = Request.Form.Files.Count;
if (!Request.ContentType.StartsWith(MultipartContentType))
return BadRequest("Contenttype er ikke korrekt");
if (filesCount == 0)
return BadRequest("Ingen fil fundet");
// Get HTTP posted file based on the fieldname.
// Check if the file is valid.
if (!Check(file.FileName, file.ContentType))
return BadRequest("Fil ikke gyldig");
var medie = new Medie
{
Name = file.FileName.Trim('\"'),
ParentId = _imageService.TempFolderGuid,
ContentLength = file.Length,
Content = memoryStream.ToArray()
};
try
{
var imageId = await _imageService.Medier_InsertMedie(medie);
//TODO Her skal vi gemme ImageId i Session
return Json(new
{
location = $"/api/media/{imageId.Id}.jpg"
});
}
catch
{
return BadRequest("Kunne ikke gemme billede");
}
}
catch
{
return StatusCode(500);
}
}
代码在我执行以下操作时失败:
await file.CopyToAsync(memoryStream)
有人能帮我吗。我迷路了
更新1
我只是尝试用建议的答案修复它,所以我的代码现在看起来如下:
[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload(IFormFile inputFile)
{
try
{
var filesCount = Request.Form.Files.Count;
if (filesCount == 0)
return BadRequest("Ingen fil fundet");
// Get HTTP posted file based on the fieldname.
var file = Request.Form.Files.GetFile("file");
if (file == null)
return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");
// Check if the file is valid.
if (!Check(file.FileName, file.ContentType))
return BadRequest("Fil ikke gyldig");
var memoryStream = new MemoryStream();
await file.CopyToAsync(memoryStream);
var medie = new Medie
{
Name = file.FileName.Trim('\"'),
ParentId = _imageService.TempFolderGuid,
ContentLength = file.Length,
Content = memoryStream.ToArray()
};
try
{
var imageId = await _imageService.Medier_InsertMedie(medie);
//TODO Her skal vi gemme ImageId i Session
return Json(new
{
location = $"/api/media/{imageId.Id}.jpg"
});
}
catch
{
return BadRequest("Kunne ikke gemme billede");
}
}
catch
{
return StatusCode(500);
}
}
[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload([FromForm]IFormFile file)
{
try
{
if (file == null)
return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");
var memoryStream = new MemoryStream();
await file.CopyToAsync(memoryStream);
var filesCount = Request.Form.Files.Count;
if (!Request.ContentType.StartsWith(MultipartContentType))
return BadRequest("Contenttype er ikke korrekt");
if (filesCount == 0)
return BadRequest("Ingen fil fundet");
// Get HTTP posted file based on the fieldname.
// Check if the file is valid.
if (!Check(file.FileName, file.ContentType))
return BadRequest("Fil ikke gyldig");
var medie = new Medie
{
Name = file.FileName.Trim('\"'),
ParentId = _imageService.TempFolderGuid,
ContentLength = file.Length,
Content = memoryStream.ToArray()
};
try
{
var imageId = await _imageService.Medier_InsertMedie(medie);
//TODO Her skal vi gemme ImageId i Session
return Json(new
{
location = $"/api/media/{imageId.Id}.jpg"
});
}
catch
{
return BadRequest("Kunne ikke gemme billede");
}
}
catch
{
return StatusCode(500);
}
}
[HttpPost,ActionName(“上传”)]
公共异步任务上载([FromForm]格式文件)
{
尝试
{
if(file==null)
返回错误请求(“Fejlkonfiguration:Filnavn ikke korrekt”);
var memoryStream=新的memoryStream();
等待文件.CopyToAsync(memoryStream);
var filescont=Request.Form.Files.Count;
如果(!Request.ContentType.StartsWith(MultipartContentType))
返回BadRequest(“Contenttype er ikke korrekt”);
如果(filescont==0)
退货申请(“Ingen fil fundet”);
//基于字段名获取HTTP发布的文件。
//检查文件是否有效。
如果(!检查(file.FileName,file.ContentType))
返回请求(“Fil ikke gyldig”);
var medie=新medie
{
Name=file.FileName.Trim(“\”),
ParentId=\u imageService.TempFolderGuid,
ContentLength=file.Length,
Content=memoryStream.ToArray()
};
尝试
{
var imageId=wait_imageService.Medier_InsertMedie(medie);
//完成她的skal vi gemme ImageId i课程
返回Json(新的
{
位置=$“/api/media/{imageId.Id}.jpg”
});
}
抓住
{
退货申请(“Kunne ikke gemme billede”);
}
}
抓住
{
返回状态码(500);
}
}
输入参数不再为null,但它仍引发相同的异常您指出
inputFile
始终为null
绑定按名称匹配表单文件
参考文献
基于
// Get HTTP posted file based on the fieldname.
var file = Request.Form.Files.GetFile("file");
已发布字段的名称为“文件”
重命名操作参数以匹配,并明确说明何时使用[FromForm]
[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload([FromForm]IFormFile file) {
try {
if (file == null)
return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");
// Check if the file is valid.
if (!Check(file.Name, file.ContentType))
return BadRequest("Fil ikke gyldig");
var medie = new Medie {
Name = file.Name.Trim('\"'),
ParentId = _imageService.TempFolderGuid
};
var fileStream = file.OpenStreamRead();
using (var memoryStream = new MemoryStream()) {
await fileStream.CopyToAsync(memoryStream);
medie.Content = memoryStream.ToArray();
medie.ContentLength = memoryStream.Length,
}
try {
var imageId = await _imageService.Medier_InsertMedie(medie);
//TODO Her skal vi gemme ImageId i Session
return Json(new {
location = $"/api/media/{imageId.Id}.jpg"
});
} catch {
return BadRequest("Kunne ikke gemme billede");
}
} catch {
return StatusCode(500);
}
}
[HttpPost,ActionName(“上传”)]
公共异步任务上载([FromForm]格式文件){
试一试{
if(file==null)
返回错误请求(“Fejlkonfiguration:Filnavn ikke korrekt”);
//检查文件是否有效。
如果(!检查(file.Name,file.ContentType))
返回请求(“Fil ikke gyldig”);
var medie=新medie{
Name=file.Name.Trim(“\”),
ParentId=\u imageService.TempFolderGuid
};
var fileStream=file.OpenStreamRead();
使用(var memoryStream=new memoryStream()){
等待fileStream.CopyToAsync(memoryStream);
medie.Content=memoryStream.ToArray();
medie.ContentLength=memoryStream.Length,
}
试一试{
var imageId=wait_imageService.Medier_InsertMedie(medie);
//完成她的skal vi gemme ImageId i课程
返回Json(新的{
位置=$“/api/media/{imageId.Id}.jpg”
});
}抓住{
退货申请(“Kunne ikke gemme billede”);
}
}抓住{
返回状态码(500);
}
}
您指出inputFile
始终为空
绑定按名称匹配表单文件
参考文献
基于
// Get HTTP posted file based on the fieldname.
var file = Request.Form.Files.GetFile("file");
已发布字段的名称为“文件”
重命名操作参数以匹配,并明确说明何时使用[FromForm]
[HttpPost, ActionName("Upload")]
public async Task<IActionResult> Upload([FromForm]IFormFile file) {
try {
if (file == null)
return BadRequest("Fejlkonfiguration: Filnavn ikke korrekt");
// Check if the file is valid.
if (!Check(file.Name, file.ContentType))
return BadRequest("Fil ikke gyldig");
var medie = new Medie {
Name = file.Name.Trim('\"'),
ParentId = _imageService.TempFolderGuid
};
var fileStream = file.OpenStreamRead();
using (var memoryStream = new MemoryStream()) {
await fileStream.CopyToAsync(memoryStream);
medie.Content = memoryStream.ToArray();
medie.ContentLength = memoryStream.Length,
}
try {
var imageId = await _imageService.Medier_InsertMedie(medie);
//TODO Her skal vi gemme ImageId i Session
return Json(new {
location = $"/api/media/{imageId.Id}.jpg"
});
} catch {
return BadRequest("Kunne ikke gemme billede");
}
} catch {
return StatusCode(500);
}
}
[HttpPost,ActionName(“上传”)]
公共异步任务上载([FromForm]格式文件){
试一试{
if(file==null)
返回错误请求(“Fejlkonfiguration:Filnavn ikke korrekt”);
//检查文件是否有效。
如果(!检查(file.Name,file.ContentType))
返回请求(“Fil ikke gyldig”);
var medie=新medie{
Name=file.Name.Trim(“\”),
ParentId=\u imageService.TempFolderGuid
};
var fileStream=file.OpenStreamRead();
使用(var memoryStream=new memoryStream()){
等待fileStream.CopyToAsync(memoryStream);
medie.Content=memoryStream.ToArray();
medie.ContentLength=memoryStream.Length,
}
试一试{
var imageId=wait_imageService.Medier_InsertMedie(medie);
//完成她的skal vi gemme ImageId i课程
返回Json(新的{
位置=$“/api/media/{imageId.Id}.jpg”
});
}抓住{
退货申请(“Kunne ikke gemme billede”);
}
}抓住{
返回状态码(500);
}
}
我觉得我应该发布我是如何解决这个问题的
问题是我有一个登录中间件,它读取httpcontext。
使用此处找到的答案:
为我解决了这个问题。我觉得我应该发布我是如何解决的 问题是我有一个登录中间件,它读取httpcontext。 使用此处找到的答案:
为我解决了这个问题。为什么不使用
inputFile
?它总是空的。我可以从请求中获取文件,尽管你为什么不使用inputFile
?它总是空的。我可以从请求中获取文件,尽管我会尝试并报告。感谢你的建议我刚刚尝试了你的解决方案,参数是不再为null。但是它会抛出sa