Microsoft Office InfoPath 2007 veya Microsoft Office InfoPath 2003 Service Pack 1 (SP1) kullanan bir Dosya eki InfoPath form şablonuna dosya eklemek için denetim. Belirli durumlarda, kodlama ve bağlı olduğu dosya kodunu çözmek isteyebilirsiniz Dosya eki Denetim. Bu durumda, Microsoft Visual C# oluşturmak için kullanabileceğiniz bir Kodlayıcı sınıf ve bir Kod çözücü sınıf. Daha sonra kullanmak Kodlayıcı sınıf ve Kod çözücü kodlama ve kod çözme dosya sınıfı
Eki.
Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar,
veya zımni garanti olmaksızın. Bu içerir, ancak bunlarla sınırlı değildir
satılabilirlik veya belirli bir uygunluk zımni garantileri için
Amaç. Bu makalede, ile programlama hakkında bilgi sahibi olduğunuz varsayılmaktadır.
gösterilen dil ve oluşturmak için kullanılan araçlar
ve yordamlar hata ayıklamak için. Microsoft destek mühendisleri açıklanmasına yardımcı olabilir
Belirli bir yordamın işlevselliğinin ancak bunlar değiştirmez
örnekler, ek işlevsellik sağlamak veya yordamlar karşılayacak şekilde geliştirmek için
belirli gereksinimleri.
Üzerinde Dosya menüsünü tıklatınYenive ardından Proje.
İçinde Yeni proje iletişim kutusunu tıklatınVisual C# Projects Microsoft Office InfoPath projeleri
klasör.
İçinde Adı kutusunaAttachmentEncodingve ardındanTAMAM.
Microsoft Office Project Sihirbazı'nı tıklatın.Yeni bir form şablonu oluşturmave ardındanSon.
Microsoft Office Project sihirbazın oluşturduğu bir
Yeni Visual Studio.AttachmentEncoding adlı net 2003 proje. Bir
InfoPath form şablonu da oluşturulur. InfoPath form şablonu
AttachmentEncoding adlı.
Visual Studio'da kodlayıcı sınıf oluşturun.NET 2003
Solution Explorer'da sağ tıklatın.AttachmentEncoding, işaret Eklemeve ardından
' ı tıklatın Yeni Öğe Ekle.
İçinde Yeni Öğe Ekle iletişim kutusunu tıklatınSınıf içinde Şablon bölmesinde türüInfoPathAttachmentEncoder.cs içindeAdı kutusunu tıklatın ve sonra Açık.
InfoPathAttachmentEncoder.cs tüm kodu Değiştir
Aşağıdaki kod dosyası.
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());
}
}
}
Solution Explorer'da sağ tıklatın.AttachmentEncoding, işaret Eklemeve ardından
' ı tıklatın Yeni Öğe Ekle.
İçinde Yeni Öğe Ekle iletişim kutusunu tıklatınSınıf içinde Şablon bölmesinde türüInfoPathAttachmentDecoder.cs içindeAdı kutusunu tıklatın ve sonra Açık.
InfoPathAttachmentDecoder.cs tüm kodu Değiştir
Aşağıdaki kod dosyası.
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; }
}
}
}
İçinde Denetimleriı görev bölmesiDüğme altındaDenetimleri Ekle.
Yeni sağ tıklatın Düğme Denetim ve
i Düğme özellikleri.
İçinde Düğme özellikleri iletişim kutusu türüEkle içinde Etiket kutusunabtnAttach içinde KİMLİĞİ kutusunu tıklatın ve sonraForm kodu Düzenle.
İçine aşağıdaki kodu ekleyin btnAttach_OnClick yöntem.
//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();
}
İçinde Denetimleriı görev bölmesiDüğme altındaDenetimleri Ekle.
Yeni sağ tıklatın Düğme Denetim ve
i Düğme özellikleri.
İçinde Düğme özellikleri iletişim kutusu türüKaydet içinde Etiket kutusunabtnSave içinde KİMLİĞİ kutusunu tıklatın ve sonraForm kodu Düzenle.
İçine aşağıdaki kodu ekleyin btnSave _OnClick yöntem.
//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>");
}
Not Bu kodu, değiştirme <Path to="" save="" the="" file=""></Path> kaydetmek istediğiniz konumu ile
dosya.
InfoPath form şablonu tam güvenilir olduğundan emin olun
Bu form InfoPath form şablonu önce sınama
tam güvenilmesi gerekir. Emin olmak için aşağıdaki yöntemlerden birini kullanabilirsiniz
InfoPath form şablonu tam, güvenilir:
Microsoft kullanın.net Framework 1.1 Yapılandırması yardımcı programı
Tam güven izinleri yalnızca Visual C# kodu atamak için.
InfoPath Software RegForm yardımcı programını kullanın
Development Kit (tam güvenilir form formu oluşturmak için sdk). Bu tam verir
Visual C# kodu izinlerine güvenir.
Formu dijital olarak imzalamak için kod imzalama sertifikası kullanın.
Şablon dosyası (.xsn). Kod imzalama sertifikasıyla dijital olarak imzalamak için kullanacağınız zaman
form şablonu dosyası kullanıcılar formu açtıklarında güven istenir
Form. Bu, tam güvenilir form sağlar. Bu nedenle, tam güven izinleri olan
Bilgisayarınızda Visual C# kodu verilir.
Kullan IPFullTrust Makro formu tam güvenilir hale getirmek için InfoPath SDK
Form. , IPFullTrust Makro bildirim dosyasındaki (.xsf) ve form otomatikleştirir.
InfoPath proje şablonu dosyası için tam güven ve IPFullTrust Makro, form şablonu otomatik olarak kaydeder.
İçin
Yükleme ve makro kullanma hakkında daha fazla bilgi için şu
Microsoft Developer Network (msdn) Web sitesi:
Dış Otomasyon InfoPath'de çağırmak için kullanın. RegisterSolution yöntem. Genellikle, form geliştirme için bu yöntemi yalnızca kullanılır
çünkü kayıtlı form yalnızca tek bir bilgisayar için kaydeder. İçin
Ek formlar, diğer kullanıcıların ek formları kendi kaydetmeniz gerekir
bilgisayarlar. Ek formları için bu yöntem önerilmez. Öneririz
form yayımladığınızda, yukarıdaki yöntemlerden herhangi biri.
Bu formu, form geliştirme aşamasında olduğundan kullanabilirsiniz
Son yöntem. Bunu yapmak için AttachmentEncoding InfoPath formu bulun.
Şablon ve sonra aşağıdaki adımları izleyin:
Üzerinde Araçlar menüsünü tıklatın Form
Seçenekleri.
' I tıklatın Güvenlik sekmesini tıklatın.
Temizlemek için tıklatın Güvenlik otomatik olarak belirleme
(önerilen) formun tasarımına dayanan düzeyi onay kutusunu seçin.
Not InfoPath otomatik olarak iş mantığı algılayamıyor,
Tam güven izinleri gerektirir. Bu nedenle, açıkça tam vermeniz gerekir
İzinleri güven.
' I tıklatın Tam güvenve ardındanTAMAM.
AttachmentEncoding InfoPath form şablonunu kapatın.
Değişiklikleri kaydetmek için istenirse tıklatın. Evet.
Not Visual Studio kapatmayın.net 2003 proje.
Visual Studio.net 2003, çift tıklatınManifest.xsf Solution Explorer'da dosya. Manifest.xsf dosyasını
açılır.
Kök düğümü bulun. publishUrl öznitelik. Kaldır publishUrl özniteliği ve değeri publishUrl öznitelik.
Değişikliklerinizi kaydetmek ve Manifest.xsf kapatın
dosya.
' I tıklatın Başlat,'ı tıklatın Çalıştır,
türü Not Defterive ardındanTAMAM.
Not Bu kodu, değiştirme<project_folder_url></project_folder_url> yolu ile
Proje klasöründeki manifest.xsf dosyasını. Kaçış yolu unutmayın.
Manifest.xsf dosyasını. Tüm bölü (\) yolu ile değiştirilmesi gereken
iki ters eğik çizgi (\).
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:892730
(http://support.microsoft.com/kb/892730/en-us/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.