Bagaimana untuk mengkode dan dekode berkas lampiran pemrograman dengan menggunakan Visual C# in InfoPath 2003

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 892730 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Dalam Microsoft Office InfoPath 2007 atau Microsoft Office InfoPath 2003 Paket Layanan 1 (SP1), Anda dapat menggunakan Lampiran file kontrol untuk melampirkan file ke bentuk InfoPath template. Dalam keadaan tertentu, Anda mungkin ingin untuk mengkode dan dekode kemudian file yang dilampirkan ke Lampiran file kontrol. Dalam kasus ini, Anda dapat menggunakan Microsoft Visual C# untuk membuat Encoder kelas dan Decoder kelas. Kemudian, Anda dapat menggunakan Encoder kelas dan Decoder kelas untuk mengkode dan dekode berkas lampiran.

PENGENALAN

Artikel ini memperkenalkan cara untuk mengkode dan dekode berkas lampiran pemrograman dengan menggunakan Microsoft Visual C# in InfoPath 2003. Untuk informasi tentang cara untuk melakukan hal ini dalam InfoPath 2010 atau dalam InfoPath 2007, lihat halaman web berikut: Bagaimana encode dan decode lampiran file pemrograman dengan menggunakan Visual C# dalam InfoPath 2010 atau dalam InfoPath 2007.

INFORMASI LEBIH LANJUT

Microsoft menyediakan pemrogaman hanya untuk ilustrasi, tanpa garansi baik tersurat maupun tersirat. Ini mencakup, namun tidak terbatas pada, jaminan tersirat mengenai keadaan yang dapat diperjualbelikan atau kesesuaian untuk tertentu tujuan. Artikel ini mengasumsikan bahwa Anda sudah familiar dengan pemrograman bahasa yang ditunjukkan dan dengan alat-alat yang digunakan untuk membuat dan memperbaiki prosedur. Teknisi Microsoft dapat membantu menjelaskan fungsionalitas prosedur tertentu, tetapi mereka tidak akan mengubah ini contoh untuk menyediakan fungsionalitas tambahan atau membuat prosedur untuk memenuhi Anda persyaratan tertentu.

Membuat proyek Visual C# InfoPath 2003

  1. Mulai Microsoft Visual Studio.NET 2003.
  2. Pada File menu, klikBaru, lalu klik Proyek.
  3. Dalam Proyek baru kotak dialog, klikVisual C# proyek dalam Microsoft Office InfoPath proyek folder.
  4. Dalam Nama kotak, jenisAttachmentEncoding, lalu klikOke.
  5. Di Microsoft Office Project Wizard, klikBuat sebuah template baru formulir, lalu klikMenyelesaikan.

    Microsoft Office Project Wizard menciptakan baru Visual Studio.NET 2003 proyek yang bernama AttachmentEncoding. An Formulir InfoPath template juga dibuat. Formulir InfoPath template bernama AttachmentEncoding.

Menciptakan kelas Encoder dalam Visual Studio.NET 2003

  1. Dalam solusi Explorer, klik kananAttachmentEncoding, arahkan ke Tambahkan, dan kemudian Klik Menambah Item baru.
  2. Dalam Menambah Item baru kotak dialog, klikKelas dalam Template panel, jenisInfoPathAttachmentEncoder.cs dalamNama kotak, dan kemudian klik Terbuka.
  3. Mengganti semua kode di InfoPathAttachmentEncoder.cs file dengan kode berikut.
    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());
    		}
    	}
    }

Menciptakan kelas Decoder dalam Visual Studio.NET 2003

  1. Dalam solusi Explorer, klik kananAttachmentEncoding, arahkan ke Tambahkan, dan kemudian Klik Menambah Item baru.
  2. Dalam Menambah Item baru kotak dialog, klikKelas dalam Template panel, jenisInfoPathAttachmentDecoder.cs dalamNama kotak, dan kemudian klik Terbuka.
  3. Mengganti semua kode di InfoPathAttachmentDecoder.cs file dengan kode berikut.
    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; }
    		}
    	}	
    }
    
    

Menambahkan File Lampiran kontrol dan kotak teks kontrol ke bentuk InfoPath

  1. Dalam bentuk AttachmentEncoding InfoPath template, Klik Kontrol dalam Desain tugas tugas panel.
  2. Dalam Kontroltugas jendela, klikFile Lampiran di bawahMasukkan kontrol.
  3. Klik kanan Lampiran file kontrol, kemudian klik File lampiran properti.
  4. Dalam File lampiran properti dialog kotak, jenis theAttachmentField dalam Lapangan Nama kotak, dan kemudian klik Oke.
  5. Dalam Kontroltugas jendela, klikKotak teks di bawahMasukkan kontrol.
  6. Klik kanan Kotak teks kontrol, dan kemudian Klik Properti kotak teks.
  7. Dalam Properti kotak teks kotak dialog, jenis theAttachmentName dalam Lapangan Nama kotak, dan kemudian klik Oke.

Tambahkan tombol melampirkan ke bentuk InfoPath

  1. Dalam Kontroltugas jendela, klikTombol di bawahMasukkan kontrol.
  2. Klik kanan baru Tombol kontrol, dan kemudian klik Tombol properti.
  3. Dalam Tombol properti kotak dialog, jenisMelampirkan dalam Label kotak, jenisbtnAttach dalam ID kotak, dan kemudian klikMengedit kode formulir.
  4. Tambahkan kode berikut ke btnAttach_OnClick metode.
    //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();
    }	
    

Tambahkan tombol Simpan ke bentuk InfoPath

  1. Beralih ke bentuk AttachmentEncoding InfoPath template.
  2. Dalam Kontroltugas jendela, klikTombol di bawahMasukkan kontrol.
  3. Klik kanan baru Tombol kontrol, dan kemudian klik Tombol properti.
  4. Dalam Tombol properti kotak dialog, jenisSimpan dalam Label kotak, jenisbtnSave dalam ID kotak, dan kemudian klikMengedit kode formulir.
  5. Tambahkan kode berikut ke btnSave _OnClick metode.
    //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>");
    }			
    
    Catatan Dalam kode ini, menggantikan <Path to="" save="" the="" file=""></Path> dengan lokasi di mana Anda ingin menyimpan file.

Pastikan bahwa bentuk InfoPath template sepenuhnya terpercaya

Sebelum Anda dapat menguji ini bentuk, bentuk InfoPath template harus sepenuhnya dipercaya. Anda dapat menggunakan salah satu metode berikut untuk memastikan formulir InfoPath template yang sepenuhnya dipercaya:
  • Menggunakan Microsoft.NET Framework 1.1 Configuration utility untuk memberikan izin penuh percaya hanya untuk Visual C# kode Anda.
  • Menggunakan utilitas RegForm dari InfoPath Software Development Kit (SDK) untuk membuat bentuk bentuk sepenuhnya dipercaya. Ini hibah penuh Mempercayai izin untuk Visual C# kode Anda.
  • Gunakan kode penandatanganan sertifikat digital menandatangani formulir file template (.xsn). Ketika Anda menggunakan kode penandatanganan sertifikat digital menandatangani berkas template bentuk, pengguna akan diminta untuk mempercayai bentuk ketika mereka membuka bentuk. Hal ini membuat bentuk sepenuhnya dipercaya. Oleh karena itu, percaya penuh hak akses yang diberikan kepada Visual C# kode Anda.
  • Penggunaan IPFullTrust makro dari SDK InfoPath untuk membuat bentuk sepenuhnya terpercaya bentuk. The IPFullTrust makro mengotomatiskan pengaturan file manifest (.xsf) dan bentuk file template dalam InfoPath proyek untuk penuh kepercayaan, dan kemudian IPFullTrust makro secara otomatis register bentuk template.

    Untuk informasi lebih lanjut tentang cara menginstal dan menggunakan makro, kunjungi berikut Situs Web Microsoft Developer Network (MSDN):
    .aspx http://msdn2.Microsoft.com/en-us/library/aa202736 (office.11)
  • Menggunakan otomatisasi eksternal dalam InfoPath untuk memanggil RegisterSolution metode. Biasanya, metode ini hanya digunakan untuk bentuk pembangunan karena bentuk terdaftar hanya register untuk komputer individu. Untuk setiap bentuk-bentuk tambahan, pengguna harus mendaftar bentuk tambahan mereka sendiri komputer. Kami tidak menyarankan metode ini untuk bentuk tambahan. Kami menyarankan salah satu dari metode sebelumnya ketika Anda mempublikasikan bentuk.
Karena bentuk ini dalam bentuk pembangunan, Anda dapat menggunakan metode yang terakhir. Untuk melakukan ini, menemukan bentuk AttachmentEncoding InfoPath template, kemudian ikuti langkah-langkah berikut:
  1. Pada Alat menu, klik Bentuk Pilihan.
  2. Klik Keamanan tab.
  3. Klik untuk menghapus Otomatis menentukan keamanan tingkat yang didasarkan pada desain formulir (dianjurkan) kotak centang.

    Catatan InfoPath tidak dapat secara otomatis mendeteksi logika bisnis yang memerlukan kepercayaan penuh izin. Oleh karena itu, Anda harus secara eksplisit memberikan penuh Mempercayai izin.
  4. Klik Kepercayaan penuh, lalu klikOke.
  5. Tutup bentuk AttachmentEncoding InfoPath template. Jika Anda diminta untuk menyimpan perubahan, klik Ya.

    Catatan Jangan tutup Visual Studio.NET 2003 proyek.
  6. Dalam Visual Studio.NET 2003, klik dua kaliManifest.xsf file dalam solusi Explorer. Berkas Manifest.xsf membuka.
  7. Di root node, temukan publishUrl atribut. Menghapus publishUrl atribut dan nilai publishUrl atribut.
  8. Menyimpan perubahan, dan kemudian tutup Manifest.xsf file.
  9. Klik Mulai, klik Menjalankan, jenis Notepad, lalu klikOke.
  10. Tambahkan kode berikut ke berkas teks kosong.
    oApp = WScript.CreateObject("InfoPath.ExternalApplication");
    strAbsolutePath = "<project_folder_url>\\Manifest.xsf";
    oApp.RegisterSolution(strAbsolutePath,"overwrite"); 
    
    Catatan Dalam kode ini, menggantikan<project_folder_url></project_folder_url> dengan jalan Manifest.xsf file dalam folder proyek Anda. Ingat untuk menghindari jalan Manifest.xsf file. Garis miring semua satu terbalik (\) di jalan harus diganti dengan garis miring dua terbalik (\).
  11. Simpan file Manifest.xsf pada komputer sebagai Register.js file.
  12. Untuk memanggil RegisterSolution metode, klik dua kali Register.js file Anda dibuat.

Menguji bentuk

  1. Di AttachmentEncoding Visual Studio.NET 2003 proyek, Klik Mulai pada Debug menu. Ini dimulai bentuk InfoPath di pratinjau mode.
  2. Pada formulir InfoPath, ketik lintasan berkas yang Anda ingin melampirkan dalam kotak teks, dan kemudian klikMelampirkan.

    Catatan Klik dua kali Lampiran file mengendalikan ke Verifikasi bahwa berkas dikodekan dengan benar.
  3. Klik Simpan. Menemukan jalan yang Anda disediakan dalam "Tambah Simpan tombol untuk bentuk InfoPath" bagian.
  4. Untuk mengakhiri tes, klik Tutup Pratinjau.

REFERENSI

Untuk informasi lebih lanjut tentang lampiran file header memformat, kunjungi Website MSDN berikut:
Melampirkan file dalam InfoPath 2003
.aspx http://msdn2.Microsoft.com/en-us/library/aa168351 (office.11)

Properti

ID Artikel: 892730 - Kajian Terakhir: 05 Maret 2012 - Revisi: 0.1
Berlaku bagi:
  • Microsoft Office InfoPath 2003
Kata kunci: 
kbcode kbscript kbsample kbxml kbprogramming kbhowto kbmt KB892730 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:892730

Berikan Masukan

 

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