簡體   English   中英

在MVC中上傳文件時,字符串或二進制數據將被截斷

[英]String or binary data would be truncated when uploading file in MVC

該文件只有14kb(14,000字節)。 我已經讀過varbinary(max)列類型(我正在使用的)只支持8,000個字節。 那是對的嗎? 如何將文件上傳到數據庫?

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 ,而不僅僅是image或jpeg。

以下是可能的內容類型列表,以便您可以相應地在ContentType列中創建足夠的空間。

varbinary  [ ( n | max) ]  
Variable-length binary data. n can be a value from 1 through 8,000. 

max表示最大存儲大小為2 ^ 31-1個字節。

http://msdn.microsoft.com/en-us/library/ms188362.aspx

那就是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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM