【问题标题】:Saving base64 image greater than 1MB to SQL Server, the image is corrupted将大于 1MB 的 base64 图像保存到 SQL Server,图像已损坏
【发布时间】:2018-08-14 10:04:26
【问题描述】:

我正在尝试从以 Xamarin 表单创建的 IOS 应用程序上传图像,问题是当文件大于 1 MB 时,无法从数据库中检索图像,错误消息是文件已损坏。 我正在使用 API 将图像保存到数据库(使用 Dapper),下面的代码显示了 base64 字符串的保存。数据字段设置为 nvarchar(max) 我认为 2 MB 不应该太大。

byte[] fileData = null;
var pic = System.Web.HttpContext.Current.Request.Files[i];
Image picIn = Image.FromStream(pic.InputStream);
using (var binaryReader = new BinaryReader(pic.InputStream))
{
    fileData = binaryReader.ReadBytes(pic.ContentLength);
}
var file = new UploadedFilesBase64()
{
    FileName = newFileName, // String Containing File Name
    UploadedFile = Convert.ToBase64String(fileData) // The Base64 String
};
using (var cn = new SqlConnection(conn))
{
    cn.Insert(file);
}

如果文件大小小于 1 MB,一切正常,我们会上传可以达到 2 MB 的文件

任何关于寻找解决方案的帮助都会很棒

【问题讨论】:

  • 无需将图像转换为base64。使用VARBINARY(max) 并上传二进制数据。
  • VARBINARY(Max) 也会出现同样的情况,我们使用的是 Sql Server 2014,我尝试了几个选项,都一样。
  • 数据库不会说“文件已损坏”,它不关心列中的内容。检查表中的实际内容 (DATALENGTH) 以及如何检索。您假设 stores 的代码是问题所在。如果您正在在这段确切的代码中收到错误消息,那么您的 Web 服务器或 HTTP 连接是问题所在,而不是您的 SQL Server。
  • 在 SQL 中为 VARBINARY(max) 列使用 UPDATEINSERT。从 C# 端发送byte[] 对象作为SqlCommand 类型SqlDbType.Image 的参数。有用。 PS:UploadedFilesBase64是什么?
  • 谢谢各位,我一直在逐行检查代码并检查每个阶段的实际图像,文件被捕获 'var pic = System.Web.HttpContext.Current.Request.Files[一世];'很好,然后从流中读取 'Image picIn = Image.FromStream(pic.InputStream);'图像仍然很好,下一行是问题仍然存在的地方,'fileData = binaryReader.ReadBytes(pic.ContentLength);'此时我尝试对其进行解码并且图像已损坏,我已经从问题中消除了 SQL,这纯粹是一个 c# 问题我正在使用 VS 2017 Enterprise

标签: c# sql-server image-uploading


【解决方案1】:

经过大量测试后,我找到了解决方案,并结合@i486 和@JeroenMostert 的想法,问题甚至是该函数存在于c# fileData = binaryReader.ReadBytes(pic.ContentLength); 成功的正确方法是这样的

Encoder myEncoder = Encoder.Quality;
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
using (var memoryStream = new MemoryStream())
{
    picIn.Save(memoryStream, jpgEncoder, myEncoderParameters);
    fileData = memoryStream.ToArray();
}

这解决了问题,现在它可以工作了

【讨论】:

  • 除非此代码通过将图像重新保存为质量极低的 jpg 来不必要地降低图像质量。您的 real 问题是尝试从同一流中读取两次。您应该只将流中的字节保存到字节数组中,然后然后从字节中制作图像,而不是相反。
  • @Nyerguds 我明白你在说什么,图像在阅读和显示时似乎很清晰,我们的想法是保存图像。我知道有更好的方法,但这是一个时间敏感的问题,因为我们无法上传图像,因为它们不清晰。我一定会根据您的建议为我们的下一个版本工作。谢谢。
猜你喜欢
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2017-01-27
  • 2016-04-14
  • 2023-03-19
  • 2014-12-27
  • 2017-06-23
相关资源
最近更新 更多