c#-获取base64编码文件的文件名
我正在尝试获取infopath 2007附件文件的名称(在xml中,默认情况下以base64Binary编码),我以前使用相同的代码实现了这一点,但由于某些原因,我无法获取我现在使用的xml文件中附件的原始文件名(我需要找到附件的.extension,文件也需要与以前同名),但是如果我手动写入文件扩展名,我可以导出文件,因此我的问题是:为什么我可以从base64字符串成功写入文件,而我无法获取其名称。c#-获取base64编码文件的文件名,c#,.net,xml,encoding,base64,C#,.net,Xml,Encoding,Base64,我正在尝试获取infopath 2007附件文件的名称(在xml中,默认情况下以base64Binary编码),我以前使用相同的代码实现了这一点,但由于某些原因,我无法获取我现在使用的xml文件中附件的原始文件名(我需要找到附件的.extension,文件也需要与以前同名),但是如果我手动写入文件扩展名,我可以导出文件,因此我的问题是:为什么我可以从base64字符串成功写入文件,而我无法获取其名称。 备注: 我目前正在尝试解码图像,我不确定问题是否在这里,但是正如前面提到的,如果我知道.ex
备注:
- 我目前正在尝试解码图像,我不确定问题是否在这里,但是正如前面提到的,如果我知道.ext并手动键入它,我可以解码它
- 从中获取附件编码字符串的xml文件是从infopath 2007“导出”的(因为没有更好的词,所以保存了?)
工作正常decodeFromBase64
处理了我以前使用的不同的xml“包”,据我所知,没有任何相关差异,因为我能够获得编码字符串并解码文件getFileName
- 我使用的代码与microsoft在解码类中提供的代码非常相似:
byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
public static string getFileName(string attachedFile)
{
string fname;
byte[] thdata = Convert.FromBase64String(attachedFile);
Encoding _encoding = Encoding.Unicode;
using (MemoryStream _memoryStream = new MemoryStream(thdata))
{
BinaryReader _theReader = new BinaryReader(_memoryStream);
_theReader.BaseStream.Position = 0;
byte[] _headerData = _theReader.ReadBytes(16);
int _fileSize = (int)_theReader.ReadUInt32();
int _attachmentNameLength = (int)_theReader.ReadUInt32() * 2;
byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
fname = _encoding.GetString(_fileNameBytes, 0, _attachmentNameLength - 2);
if (fname.Length > 0)
return fname;
}
return fname;
}
/**********************************************/
byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
public static string getFileName(string attachedFile)
{
string fname;
byte[] thdata = Convert.FromBase64String(attachedFile);
Encoding _encoding = Encoding.Unicode;
using (MemoryStream _memoryStream = new MemoryStream(thdata))
{
BinaryReader _theReader = new BinaryReader(_memoryStream);
_theReader.BaseStream.Position = 0;
byte[] _headerData = _theReader.ReadBytes(16);
int _fileSize = (int)_theReader.ReadUInt32();
int _attachmentNameLength = (int)_theReader.ReadUInt32() * 2;
byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
fname = _encoding.GetString(_fileNameBytes, 0, _attachmentNameLength - 2);
if (fname.Length > 0)
return fname;
}
return fname;
}
编辑:- 我忘了提到,不久前我用同样的代码试图解码一个从以前的文件编码的字符串,它成功了
《强刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支##########################
即使我找到了解决方案,我也不确定问题的确切来源。我编码的字符串的完整性不知怎么被破坏了(不知怎的,我把测试模板的构建搞砸了,在测试了附件所在的xml文件后,一切都很顺利而且到目前为止,编码字符串不起作用的文件只有我自己的,考虑到我以前从未直接使用过infopath,这完全有道理)
供将来参考:以下是官方解码器和编码器类
- InfoPath 2003
support.microsoft\u com/en-us/help/892730/how-to-encode-and-decode-a-file-attachment-programmetically-by-use-visual-c-in-infopath-2003 - InfoPath 2007和2010
support.microsoft\u com/en-us/help/2517906/how-to-encode-and-to-decode-a-file-attachment-programmetically-by-use-visual-c-in-infopath-2010-or-in-infopath-2007
(不能发布超过2个链接,我稍后会编辑)