将base64映像大于1MB保存到SQL Server,图像已损坏

时间:2018-03-06 14:03:45

标签: c# sql-server image-uploading

我正在尝试从以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

任何寻求解决方案的帮助都很棒

1 个答案:

答案 0 :(得分:0)

经过大量测试后我找到了解决方案,并且根据@ 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();
}

这解决了问题,现在可行了