在MVC中上传文件时,字符串或二进制数据将被截断
本文关键字:数据 二进制 字符串 MVC 文件 | 更新日期: 2023-09-27 18:13:06
文件只有14kb(14000字节)。我读到varbinary(max)
列类型(这是我正在使用的)只支持8000字节。对吗?我怎样才能把文件上传到数据库?
if (file.ContentLength < (3 * 1048576))
{
// extract only the fielname
var fileName = Path.GetFileName(file.FileName);
using (MemoryStream ms = new MemoryStream())
{
file.InputStream.CopyTo(ms);
byte[] array = ms.GetBuffer();
adj.resumeFile = array;
adj.resumeFileContentType = file.ContentType;
}
}
错误:
字符串或二进制数据将被截断。声明是终止。
检查在此过程中插入的其他列。我会特别检查ContentType
列,因为这将是image/jpeg
之类的东西,而不是简单的图像或jpeg。
这里是一个可能的内容类型列表,以便您可以在您的ContentType列中相应地创建足够的空间
varbinary [ ( n | max) ]
Variable-length binary data. n can be a value from 1 through 8,000.
http://msdn.microsoft.com/en-us/library/ms188362.aspxmax表示最大存储空间为2^31-1字节。
就是2GB。
如果在表定义中将列定义为VARBINARY(MAX)
,那么应该拥有最多2 GB的存储空间。如果您将最大列大小指定为数字,那么您只能显式地请求最多VARBINARY(8000)
。
详情请参阅此问题
AFAIK VARBINARY(MAX)
只出现在SQL Server 2008,所以如果你的数据库早于那个版本,你可能需要升级它。
我知道这不是你问题的答案,但是ms.GetBuffer()将获得底层缓冲区,这可能不是你的数据的确切大小。MemoryStream为写入分配额外的空间,您可能会从未使用的缓冲区中插入额外的字节。这里你可以看到GetBuffer()返回一个256字节的数组,即使文件只有5字节长:
using (MemoryStream ms = new MemoryStream())
{
using (FileStream fs = File.OpenRead("C:''t''hello.txt"))
{
fs.CopyTo(ms);
byte[] results = ms.GetBuffer();
Console.WriteLine("Size: {0}", results.Length); // 256
byte[] justdata = new byte[ms.Length];
Array.Copy(results, justdata, ms.Length);
Console.WriteLine("Size: {0}", justdata.Length); // 5
}
}