2014-12-04 89 views
0

在我们的情况下,我们使用Microsoft Dynamics NAV将文件存储在SQL数据库中。之后,我们将此blob/image数据转换为base64字符串,通过SOAP服务将其传输并再次保存为文件。生成的文件总是比原始文件大得多。文件大小似乎遵循2倍的独特模式。120KB,248KB,504KB,1016KB,2040KB等。以SQL映像形式存储并以64位字符串形式传输后的文件大小字符串

示例: 存储23.669.715字节的文件会生成33.546.240字节的文件遵循这条路线。

C#代码来保存文件:

string fileData = string.Empty; 
WebshopMgt webService = Helpers.WebServices.GetWebshopService(); 

try 
{ 
    webService.GetDocumentData(navDocument.IntegrationID, ref fileData); 
} 
catch (Exception ex) 
{ 
    Log.Error(String.Format("Error retrieving document data for NAV Document '{0}'.",  navDocument.IntegrationID), ex); 
    return Status.SetStatus(navDocument.IntegrationID, syncId, SyncStatus.Failed, ex.Message); 
} 

try 
{ 
    byte[] buffer = Convert.FromBase64String(fileData); 
    FileStream fileStream = File.Create(filePath); 
    fileStream.Write(buffer, 0, buffer.Length); 
    fileStream.Close(); 
} 
catch (Exception ex) 
{ 
    Log.Error(String.Format("Error saving document data for NAV Document '{0}'.", navDocument.IntegrationID), ex); 
    return Status.SetStatus(navDocument.IntegrationID, syncId, SyncStatus.Failed, ex.Message); 
} 
+0

此代码[看起来不错](http://msdn.microsoft.com/en-us/library/system.convert.frombase64string%28v=vs.110%29.aspx),所以问题可能在于存储或检索数据。 – CodeCaster 2014-12-04 11:45:46

+0

在调试时我看到一个模式。所有的字符串都填充了很多'A'。一些字符串最后有成千上万的A.全部以A ==结尾。 – 2014-12-04 14:41:48

+0

在几乎所有base 64实现中都给定了'A = 0',在某个地方你不会保存内容长度,而是实际的整个缓冲区。假设你使用的是1024字节的缓冲区,而你的内容只有1字节长,似乎是节省了1023个“0”。 – CodeCaster 2014-12-04 15:13:04

回答

1

任何有兴趣; 我正在使用MemoryStream上的GetBuffer方法将文件数据转换为base64。原来,这也给你所有分配的内存空间,包括未使用的字节。使用ToArray方法仅返回数据本身。

相关问题