【问题标题】:unable to convert uploaded image to byte array无法将上传的图像转换为字节数组
【发布时间】:2015-08-18 21:06:28
【问题描述】:

我正在尝试将上传的图像转换为字节数组,以便将其存储在数据库表中。

下面的代码用于执行从图像到字节数组的转换:

public byte[] ConvertToBytes(HttpPostedFileBase image)
{
     BinaryReader reader = new BinaryReader(image.InputStream);
     var imageBytes = reader.ReadBytes((int)image.ContentLength);
     return imageBytes;
}

当我在此代码上放置断点以查看返回的内容时,imageBytes 变量显示 {byte[0]}。

下面显示的代码是控制器中接收我用来上传这张图片的视图的 ActionResult(目前我正在使用文件输入来选择和上传图片):

[HttpPost]
public ActionResult NewsManager(NewsManagerViewModel model)
{
    var newsManagerRepository = new NewsManagerRepository();
    var currentUser = User.Identity.Name;

    if (ModelState.IsValid)
    {
        HttpPostedFileBase file = Request.Files["ImageData"];

        var fileIsImage = file.IsImage();

        if (fileIsImage)
        {
            model.Author = currentUser;

            var newsUploaded = newsManagerRepository.UploadNews(file, model);

            if (newsUploaded == 1)
            {
                return View();
                }

                ModelState.AddModelError("uploadFailed", "News item was not uploaded");

                return View(model);
                }
                ModelState.AddModelError("fileNotImage", "the file you have uploaded is not an image");

                return View(model);
            }

            return View(model);
        }

有没有人知道为什么我正在转换的图像没有成功转换为字节数组?

非常感谢任何建议,该应用程序目前是 MVC 5 和 .net 版本 4.5。


调用方法代码如下:

public int UploadNews(HttpPostedFileBase file, NewsManagerViewModel model)
{
    model.BannerImage = ConvertToBytes(file);
    var ndtms2Utils = new NDTMS2UtilsEntities();

    var news = new News
    {
        Title = model.Title,
        Author = model.Author,
        BannerImage = model.BannerImage,
        DateCreated = DateTime.Now,
        NewsContent = model.NewsContent
    };

    ndtms2Utils.News.Add(news);
    int i = ndtms2Utils.SaveChanges();
    if (i == 1)
    {
        return 1;
    }
    return 0;
}

【问题讨论】:

  • 那么image.ContentLength 是什么?我怀疑它是 0...
  • 检查断点时我上传的最后一张图片的内容长度为 394323
  • 你在哪里打电话给ConvertToBytes?也许你已经从流中读过? (这可以解释一切。)
  • 90% 的时间使用BinaryReader 是错误的选择。

标签: c# bytearray binaryreader httppostedfilebase


【解决方案1】:

使用下面提到的转换方法:

public byte[] ConvertToBytes(HttpPostedFileBase image)
{
   return image.InputStream.StreamToByteArray();
}

public static byte[] StreamToByteArray(this Stream input)
{
    input.Position = 0;
    using (var ms = new MemoryStream())
    {
        int length = System.Convert.ToInt32(input.Length);
        input.CopyTo(ms, length);
        return ms.ToArray();
    }
}

【讨论】:

  • StreamToByteArray 是那个扩展方法,因为Visual Studio好像找不到它
  • 将此扩展方法添加到任何静态类并玩得开心:)
猜你喜欢
  • 2019-05-18
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2013-05-19
相关资源
最近更新 更多