인코딩 및 C# InfoPath 2003을 사용 하 여 프로그래밍 방식으로 첨부 파일을 디코딩하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 892730 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

InfoPath 2007 Microsoft Office 또는 Microsoft Office InfoPath 2003 서비스 팩 1 (SP1)에서 사용할 수 있는 첨부 파일 InfoPath 양식 서식 파일에 파일 첨부 컨트롤입니다. 특정 상황에서 인코딩 및 다음 연결 된 파일을 디코딩 원하는 수의 첨부 파일 컨트롤입니다. 이 경우 Microsoft Visual C# 사용 하면 만들 수 있는 인코더 클래스 a 디코더 클래스입니다. 다음 사용할 수 있는 인코더 클래스 및 디코더 인코딩 및 디코딩 파일 클래스 첨부 파일입니다.

소개

이 문서에서는 인코딩 및 Microsoft Visual C# InfoPath 2003을 사용 하 여 프로그래밍 방식으로 첨부 파일을 디코딩하는 방법에 소개 합니다. InfoPath 2007 또는 InfoPath 2010에서 이렇게 하는 방법에 대 한 내용은 다음 웹 페이지를 참조 하십시오. 인코딩 하는 방법과 C#에서 InfoPath 2010 또는 InfoPath 2007을 사용 하 여 프로그래밍 방식으로 첨부 파일을 디코딩하는 데.

추가 정보

Microsoft 프로그래밍 예제를 돕기 위해 제공, 묵시적인 보증 없이. 이 포함 되지만 제한 되지 않고 상품성 또는 특정에 대 한 적합성의 묵시적된 보증 하려면 목적입니다. 이 문서에서는 프로그래밍에 익숙한 가정 합니다. 여기서 설명 하는 언어를 만드는 데 사용 되는 도구 및 하 고 프로시저를 디버깅할 수 있습니다. Microsoft 지원 엔지니어 데 도움이 설명의 특정 프로시저의 기능을 있지만 이러한 수정 하지 예제 추가 기능을 제공 하거나에 맞도록 프로시저를 구성 하 여 특정 요구 사항이 있습니다.

Visual C# InfoPath 2003 프로젝트 만들기

  1. Microsoft Visual Studio 시작 합니다.NET 2003입니다.
  2. 파일 메뉴를 클릭를 클릭 하 고 다음을 누릅니다. 프로젝트.
  3. 새 프로젝트 대화 상자에서 클릭Visual C# 프로젝트 InfoPath 프로젝트의 Microsoft Office 폴더입니다.
  4. 이름 상자, 형식AttachmentEncoding를 클릭 하 고 다음을 누릅니다.확인.
  5. Microsoft Office 프로젝트 마법사를 클릭 합니다.새 양식 서식 파일 만들기를 클릭 하 고 다음을 누릅니다.마침.

    Microsoft Office 프로젝트 마법사는 새로운 Visual Studio.AttachmentEncoding 라는 NET 2003 프로젝트입니다. 는 InfoPath 양식 서식 파일을 만들어 수도 있습니다. InfoPath 양식 서식 파일 명명 된 Attachmentencoding입니다.

Visual Studio는 인코더 클래스를 만듭니다.NET 2003

  1. 솔루션 탐색기에서 마우스 오른쪽 단추로 클릭AttachmentEncoding을 가리킵니다 추가다음 클릭 새 항목 추가.
  2. 새 항목 추가 대화 상자에서 클릭클래스서식 파일 형식 창InfoPathAttachmentEncoder.cs이름 상자를 클릭 하 고 열기.
  3. 모든 코드는 InfoPathAttachmentEncoder.cs 대체 파일을 다음 코드를 사용 합니다.
    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace InfoPathAttachmentEncoding
    {
    	/// <summary>
    	/// InfoPathAttachment encodes file data into the format expected by InfoPath for use in file attachment nodes.
    	/// </summary>
    	public class InfoPathAttachmentEncoder
    	{
    		private string base64EncodedFile = string.Empty;
    		private string fullyQualifiedFileName;
    
    		/// <summary>
    		/// Creates an encoder to create an InfoPath attachment string.
    		/// </summary>
    		/// <param name="fullyQualifiedFileName"></param>
    		public InfoPathAttachmentEncoder(string fullyQualifiedFileName)
    		{
    			if (fullyQualifiedFileName == string.Empty)
    				throw new ArgumentException("Must specify file name", "fullyQualifiedFileName");
    
    			if (!File.Exists(fullyQualifiedFileName))
    				throw new FileNotFoundException("File does not exist: " + fullyQualifiedFileName, fullyQualifiedFileName);
    
    			this.fullyQualifiedFileName = fullyQualifiedFileName;
    		}
    
    		/// <summary>
    		/// Returns a Base64 encoded string.
    		/// </summary>
    		/// <returns>String</returns>
    		public string ToBase64String()
    		{
    			if (base64EncodedFile != string.Empty)
    				return base64EncodedFile;
    
    			// This memory stream will hold the InfoPath file attachment buffer before Base64 encoding.
    			MemoryStream ms = new MemoryStream();
    
    			// Get the file information.
    			using (BinaryReader br = new BinaryReader(File.Open(fullyQualifiedFileName, FileMode.Open, FileAccess.Read, FileShare.Read)))
    			{
    				string fileName = Path.GetFileName(fullyQualifiedFileName);
    
    				uint fileNameLength = (uint)fileName.Length + 1;
    
    				byte[] fileNameBytes = Encoding.Unicode.GetBytes(fileName);
    
    				using (BinaryWriter bw = new BinaryWriter(ms))
    				{
    					// Write the InfoPath attachment signature. 
    					bw.Write(new byte[] { 0xC7, 0x49, 0x46, 0x41 });
    
    					// Write the default header information.
    					bw.Write((uint)0x14);	// size
    					bw.Write((uint)0x01);	// version
    					bw.Write((uint)0x00);	// reserved
    
    					// Write the file size.
    					bw.Write((uint)br.BaseStream.Length);
    
    					// Write the size of the file name.
    					bw.Write((uint)fileNameLength);
    
    					// Write the file name (Unicode encoded).
    					bw.Write(fileNameBytes);
    
    					// Write the file name terminator. This is two nulls in Unicode.
    					bw.Write(new byte[] {0,0});
    
    					// Iterate through the file reading data and writing it to the outbuffer.
    					byte[] data = new byte[64*1024];
    					int bytesRead = 1;
    
    					while (bytesRead > 0)
    					{
    						bytesRead = br.Read(data, 0, data.Length);
    						bw.Write(data, 0, bytesRead);
    					}
    				}
    			}
    
    
    			// This memorystream will hold the Base64 encoded InfoPath attachment.
    			MemoryStream msOut = new MemoryStream();
    
    			using (BinaryReader br = new BinaryReader(new MemoryStream(ms.ToArray())))
    			{
    				// Create a Base64 transform to do the encoding.
    				ToBase64Transform tf = new ToBase64Transform();
    
    				byte[] data = new byte[tf.InputBlockSize];
    				byte[] outData = new byte[tf.OutputBlockSize];
    
    				int bytesRead = 1;
    
    				while (bytesRead > 0)
    				{
    					bytesRead = br.Read(data, 0, data.Length);
    
    					if (bytesRead == data.Length)
    						tf.TransformBlock(data, 0, bytesRead, outData, 0);
    					else
    						outData = tf.TransformFinalBlock(data, 0, bytesRead);
    
    					msOut.Write(outData, 0, outData.Length);
    				}
    			}
    
    			msOut.Close();
    			
    			return base64EncodedFile = Encoding.ASCII.GetString(msOut.ToArray());
    		}
    	}
    }

디코더 클래스에서 Visual Studio 만듭니다.NET 2003

  1. 솔루션 탐색기에서 마우스 오른쪽 단추로 클릭AttachmentEncoding을 가리킵니다 추가다음 클릭 새 항목 추가.
  2. 새 항목 추가 대화 상자에서 클릭클래스서식 파일 형식 창InfoPathAttachmentDecoder.cs이름 상자를 클릭 하 고 열기.
  3. 모든 코드는 InfoPathAttachmentDecoder.cs 대체 파일을 다음 코드를 사용 합니다.
    using System;
    using System.IO;
    using System.Text;
    
    namespace InfoPathAttachmentEncoding
    {
    	/// <summary>
    	/// Decodes a file attachment and saves it to a specified path.
    	/// </summary>
    	public class InfoPathAttachmentDecoder
    	{
    		private const int SP1Header_Size = 20;
    		private const int FIXED_HEADER = 16;
    
    		private int fileSize;
    		private int attachmentNameLength;
    		private string attachmentName;
    		private byte[] decodedAttachment;
    
    		/// <summary>
    		/// Accepts the Base64 encoded string
    		/// that is the attachment.
    		/// </summary>
    		public InfoPathAttachmentDecoder(string theBase64EncodedString)
    		{
    			byte [] theData = Convert.FromBase64String(theBase64EncodedString);
    			using(MemoryStream ms = new MemoryStream(theData))
    			{
    				BinaryReader theReader = new BinaryReader(ms);			
    				DecodeAttachment(theReader);
    			}
    		}
    
    		private void DecodeAttachment(BinaryReader theReader)
    		{
    			//Position the reader to get the file size.
    			byte[] headerData = new byte[FIXED_HEADER];
    			headerData = theReader.ReadBytes(headerData.Length);
    
    			fileSize = (int)theReader.ReadUInt32();
    			attachmentNameLength = (int)theReader.ReadUInt32() * 2;
    			
    			byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
    			//InfoPath uses UTF8 encoding.
    			Encoding enc = Encoding.Unicode;
    			attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2);
    			decodedAttachment = theReader.ReadBytes(fileSize);
    		}
    
    		public void SaveAttachment(string saveLocation)
    		{
    			string fullFileName = saveLocation;
    			if(!fullFileName.EndsWith(Path.DirectorySeparatorChar))
    			{
    				fullFileName += Path.DirectorySeparatorChar;
    			}
    
    			fullFileName += attachmentName;
    
    			if(File.Exists(fullFileName))
    				File.Delete(fullFileName);
    			
    			FileStream fs = new FileStream(fullFileName, FileMode.CreateNew);
    			BinaryWriter bw = new BinaryWriter(fs);
    			bw.Write(decodedAttachment);
    
    			bw.Close();
    			fs.Close();
    		}
    
    		public string Filename
    		{
    			get{ return attachmentName; }
    		}
    
    		public byte[] DecodedAttachment
    		{
    			get{ return decodedAttachment; }
    		}
    	}	
    }
    
    

InfoPath 양식에 파일 첨부 컨트롤 및 텍스트 상자 컨트롤을 추가

  1. AttachmentEncoding InfoPath 양식 서식 파일에 클릭 컨트롤디자인 작업 작업 창입니다.
  2. 컨트롤작업창에서파일 첨부 파일 아래에서컨트롤을 삽입 합니다..
  3. 마우스는 첨부 파일 컨트롤 다음을 클릭 하 고 첨부 파일 속성.
  4. 첨부 파일 속성 대화 상자 상자, 형식 theAttachmentField필드 이름 상자를 클릭 하 고 확인.
  5. 컨트롤작업창에서텍스트 상자 아래에서컨트롤을 삽입 합니다..
  6. 마우스는 텍스트 상자 컨트롤을 누른 다음 클릭 텍스트 상자 속성.
  7. 텍스트 상자 속성 대화 상자 형식 theAttachmentName필드 이름 상자를 클릭 하 고 확인.

InfoPath 양식에 첨부 단추 추가

  1. 컨트롤작업창에서단추 아래에서컨트롤을 삽입 합니다..
  2. 새 마우스 오른쪽 단추로 클릭 단추 컨트롤 및 다음을 누릅니다. 단추 속성.
  3. 단추 속성 대화 상자, 형식첨부레이블 상자, 형식btnAttachID 상자를 클릭 하 고양식 코드 편집.
  4. 다음 코드를 추가 btnAttach_OnClick 방법입니다.
    //Get a reference to the attachment node.
    IXMLDOMNode theAttachmentNode = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentField");
    
    //Get a reference to the filename node.
    IXMLDOMNode fileNameNode = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentName");
    //Get the text of the node.
    String fileName = fileNameNode.text;
    if(fileName.Length > 0)
    {
    	//Encode the file and assign it to the attachment node.
    	InfoPathAttachmentEncoding.Encoder myEncoder = new InfoPathAttachmentEncoding.Encoder(fileName);
    	if(theAttachmentNode.attributes.getNamedItem("xsi:nil") != null)
    		theAttachmentNode.attributes.removeNamedItem("xsi:nil");
    	theAttachmentNode.text = myEncoder.ToBase64String();
    }	
    

InfoPath 양식에 저장 단추 추가

  1. AttachmentEncoding InfoPath 양식으로 전환 서식 파일입니다.
  2. 컨트롤작업창에서단추 아래에서컨트롤을 삽입 합니다..
  3. 새 마우스 오른쪽 단추로 클릭 단추 컨트롤 및 다음을 누릅니다. 단추 속성.
  4. 단추 속성 대화 상자, 형식저장레이블 상자, 형식btnSaveID 상자를 클릭 하 고양식 코드 편집.
  5. 다음 코드를 추가 btnSave _OnClick 방법입니다.
    //Get a reference to the attachment node.
    IXMLDOMNode n = thisXDocument.DOM.selectSingleNode("my:myFields/my:theAttachmentField");
    //Get the text of the node.
    String theAttachment = n.text;
    if(theAttachment.Length > 0)
    {
    	InfoPathAttachmentEncoding.Decoder myDecoder = new InfoPathAttachmentEncoding.Decoder(theAttachment);
    	myDecoder.SaveAttachment(@"<Path to save the file>");
    }			
    
    참고 이 코드를 바꿉니다 <Path to="" save="" the="" file=""></Path> 저장 하려는 위치를 파일입니다.

InfoPath 양식 서식 파일을 완전히 신뢰할 수 있는지 확인

전에이 양식을 InfoPath 양식 서식 파일을 테스트할 수 있습니다. 완전히 신뢰할 수 있어야 합니다. 있는지 확인 하려면 다음 방법 중 하나를 사용할 수 있습니다. InfoPath 양식 서식 파일이 완전히 임을 신뢰할 수 있는.
  • Microsoft를 사용 합니다.NET Framework 1.1 구성 유틸리티 C# 코드에만 완전 신뢰 권한을 부여.
  • RegForm 유틸리티 소프트웨어 Infopath에서에서 사용 합니다. SDK 개발 키트 (양식을 완전히 신뢰할 수 있는 양식을 확인 합니다). 이 전체 부여 사용 권한을 C# 코드를 신뢰 합니다.
  • 코드 서명 인증서를 사용 하 여 양식에 디지털 서명 하려면 서식 파일 (.xsn)을 선택 합니다. 디지털 서명 하려면 코드 서명 인증서를 사용 양식 서식 파일을 사용자가 열 때 양식이 신뢰할 것인지 묻는 메시지가 나타납니다의 양식입니다. 이렇게 하면 양식을 완전히 신뢰할 수 있습니다. 따라서 완전 신뢰 권한이 있습니다 C# 코드에 부여 합니다.
  • 사용의 IPFullTrust 매크로에서 InfoPath 양식을 완전히 신뢰할 수 있게 SDK 양식입니다. 는 IPFullTrust 매니페스트 파일 (.xsf)과 양식 설정을 자동화 하는 매크로 InfoPath 프로젝트에서 서식 파일에 완전 신뢰를 한 다음에 IPFullTrust 매크로 자동으로 양식 서식 파일을 등록합니다.

    에 대 한 설치 및 매크로 사용 하는 방법에 대 한 자세한 내용은 다음을 참조 하십시오 Microsoft 개발자 네트워크 (MSDN) 웹 사이트:
    http://msdn2.microsoft.com/en-us/library/aa202736 (office.11).aspx
  • Infopath에서 외부 자동화를 사용 하 여 호출 하는 RegisterSolution 방법입니다. 일반적으로 양식 개발에 대 한이 방법만 사용 됩니다. 등록된 폼에만 개별 컴퓨터를 등록 하기 때문입니다. 에 대 한 추가 양식을 다른 사용자가 추가 폼 자체에 등록 해야 컴퓨터입니다. 우리는이 메서드를 다른 폼에 대 한 권장 하지 않습니다. 좋습니다. 양식을 게시할 때 이전 방법 중 하나입니다.
이 양식은 양식 개발 중 이므로 사용할 수 있는 마지막 방법입니다. 이렇게 하려면 AttachmentEncoding InfoPath 양식을 찾습니다 서식 파일을 클릭 하 고 다음이 단계를 수행 하십시오.
  1. 도구 메뉴를 클릭 양식 옵션.
  2. 클릭 하 여 보안 탭입니다.
  3. 선택을 취소 하 여 자동으로 보안을 결정 합니다. (권장) 양식의 디자인에 따라 한 수준 확인란입니다.

    참고 Infopath는 비즈니스 논리를 감지할 수 없는 자동으로 완전 신뢰 권한이 필요 합니다. 따라서 전체를 명시적으로 부여 해야 사용 권한을 신뢰 합니다.
  4. 클릭 완전 신뢰를 클릭 하 고 다음을 누릅니다.확인.
  5. AttachmentEncoding InfoPath 양식 서식 파일을 닫습니다. 변경 내용을 저장할지 묻는 메시지가 표시 되 면 클릭 합니다. 예].

    참고 Visual Studio 닫지 마십시오.NET 2003 프로젝트입니다.
  6. Visual Studio.NET 2003을 두 번 클릭 하 여Manifest.xsf 솔루션 탐색기에서 파일입니다. Manifest.xsf 파일 열립니다.
  7. 루트 노드를 찾기는 publishUrl 특성입니다. 제거는 publishUrl 특성 및 값을 publishUrl 특성입니다.
  8. 변경 내용을 저장 하 고 있는 manifest.xsf를 닫습니다 파일입니다.
  9. 클릭 시작를 클릭 실행, 형식 메모장를 클릭 하 고 다음을 누릅니다.확인.
  10. 빈 텍스트 파일에 다음 코드를 추가 합니다.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    참고 이 코드를 바꿉니다<project_folder_url></project_folder_url> 경로와 Manifest.xsf 파일을 프로젝트 폴더에 있습니다. 기억의 경로 이탈 하 여 Manifest.xsf 파일입니다. 경로에 있는 모든 단일 백슬래시 (\)를 교체 해야 두 개의 백슬래시 (\)입니다.
  11. Manifest.xsf 파일을 컴퓨터에 저장을 Register.js 파일입니다.
  12. 호출 하는 RegisterSolution 메서드를 두 번 클릭 하 여 Register.js 파일 생성 합니다.

양식 테스트

  1. AttachmentEncoding Visual Studio.NET 2003 프로젝트로 변환 클릭 시작디버그 메뉴입니다. 이 시작합니다. 미리 보기 모드에서 InfoPath 양식입니다.
  2. InfoPath 양식에 파일의 경로 입력 하 텍스트 상자에 연결 하 고 다음을 클릭 하 고 원합니다첨부.

    참고 두 번 클릭 하 여 첨부 파일 제어 합니다. 확인할 파일이 올바르게 인코딩됩니다.
  3. 클릭 저장. 경로 찾을 것 제공 되는 "추가 저장 InfoPath 양식에 단추 " 섹션입니다.
  4. 테스트를 종료 하려면 클릭 합니다. 닫기 미리 보기.

참조

첨부 파일 헤더에 대 한 자세한 내용은 서식을 지정 하려면 다음 MSDN 웹 사이트를 방문 하십시오.
InfoPath 2003에서에서 파일을 첨부합니다.
http://msdn2.microsoft.com/en-us/library/aa168351 (office.11).aspx

속성

기술 자료: 892730 - 마지막 검토: 2012년 3월 5일 월요일 - 수정: 0.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office InfoPath 2003
키워드:?
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
이 문서의 영문 버전 보기:892730

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com