惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
爱范儿
爱范儿
小众软件
小众软件
K
Kaspersky official blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
V
Vulnerabilities – Threatpost
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX
C
Check Point Blog
S
Schneier on Security
P
Palo Alto Networks Blog
IT之家
IT之家
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Project Zero
Project Zero
Y
Y Combinator Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
S
Securelist
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理

博客园 - 翅膀

WCF测试机部署服务器 .net 操作 EXCEL OpenXML 替换word模板中的标签 AgilePoint BPMS 业务流程 List中插入超链接栏 结合eventHanlder和openXMl 实现上传word文档加页眉,页脚 moss 自定义文档库文档图标 - 翅膀 Microsoft Office SharePoint Server 2007的文件目录结构 常用的stsadm命令行参数 如何隐藏“查看所有网站内容” 查看SharePoint未知错误 Layouts里的页面应用站点母板页 MOSS和其他系统的数据集成方式 MOSS中获取当前用户信息 关于MOSS中,用代码实现在列表中新增一列为增强型的RichTextField 自定义字段类型的开发[转] C#.net中操作XML - 翅膀 SharePoint Web Service系列:编写自定义SharePoint Web Services之二 SharePoint Web Service系列:编写自定义SharePoint Web Services之一
InfoPath 上传多附件解决方法
翅膀 · 2008-12-19 · via 博客园 - 翅膀

前几天,由于项目的需求,需要在infopath中上传多附件,当我用重复表设计好表单后。以为,客户的需求已经很容易的就搞定了

,没想到当我在测试的到时候。发现了infopath在一次上传附件时,最大容量才5M

没办法,只好想别的解决方案了。之后,想到的方案就是:在表单提交之前讲infopath表单中的附件分解并上传到MOSS文档库中。

这样不当可以解决附件上传的问题,同时也避免了表单容量大的问题,可谓是一举两得

同时也支持附件的删除

首先看看设计的表单,两个重复表,一个是用来上传多附件,另一个是用来存放上传附件的列表

当看到,上传附件列表中已经有数据是,可以到相应的文档库中找到infopath中上传的附件,如图标有“新”字样的就是infopath中的附件分解出来的

效果图,就是这样了,下面来看看终点的,代码部分

代码部分主要的技术点就是infopath附件的分解和对infopath重复表的操作

命名空间的引用

using Microsoft.Office.InfoPath;
using System;
using System.Xml;
using System.Xml.XPath;
using System.Windows.Forms;
using System.Text;

首先是注册两个按钮事件

 public void InternalStartup()
        {
            ((ButtonEvent)EventManager.ControlEvents[
"CTRL12_5"]).Clicked += new ClickedEventHandler(CTRL12_5_Clicked);
            ((ButtonEvent)EventManager.ControlEvents[
"CTRL18_5"]).Clicked += new ClickedEventHandler(CTRL18_5_Clicked);
        }

编写上传按钮事件,主要处理的是文件的分解,上传,以及重复表的删除,增加

 public void CTRL12_5_Clicked(object sender, ClickedEventArgs e)
        {
            
// 在此处编写代码。  

            XPathNavigator domNav 
= MainDataSource.CreateNavigator();
            XPathNodeIterator rows 
= domNav.Select("/my:myFields/my:group3/my:group5", NamespaceManager);
            XPathNodeIterator rows1;
            
string myNamespace = NamespaceManager.LookupNamespace("my");while (rows.MoveNext())
            {
                rows1 
= domNav.Select("/my:myFields/my:group6/my:group7", NamespaceManager);
                
string attachment = rows.Current.SelectSingleNode("my:attachment", NamespaceManager).Value;
                
byte[] attachmentBytes = Convert.FromBase64String(attachment);
                
int namebufferlen = attachmentBytes[20* 2;
                
byte[] fileNameBuffer = new byte[namebufferlen];// The actual filename starts at position 24
                for (int i = 0; i < namebufferlen; i++)
                {
                    fileNameBuffer[i] 
= attachmentBytes[24 + i];
                }
// original filename minus the last character !
                char[] asciiChars = UnicodeEncoding.Unicode.GetChars(fileNameBuffer);
                
string fileName = new string(asciiChars);
                fileName 
= fileName.Substring(0, fileName.Length - 1);
                
//arrayName.Add(fileName);// The file is located after the header, which is 24 bytes long
                
// plus the length of the filename.
                byte[] fileContent = new byte[attachmentBytes.Length - (24 + namebufferlen)];
                
for (int i = 0; i < fileContent.Length; i++)
                {
                    fileContent[i] 
= attachmentBytes[24 + namebufferlen + i];
                }

                APWS.AgileParts apws 

= new 附件.APWS.AgileParts();
                
string savePath = @"http://ascentn-moss:8080/Shared%20Documents";
                apws.Credentials 
= System.Net.CredentialCache.DefaultCredentials;
                
string attachUrl = apws.UploadFileToSPS2(savePath + "/" + fileName, true, fileContent);int k = 0;
                
if (rows1.Count == 0)
                    k 
= 1;
                
else
                    k 
= rows1.Count + 1;using (XmlWriter writer = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:group6", NamespaceManager).AppendChild())
                {
                    writer.WriteStartElement(
"group7", myNamespace);
                    writer.WriteElementString(
"fieldID", myNamespace, k.ToString());
                    writer.WriteElementString(
"fieldURL", myNamespace, attachUrl);
                    writer.WriteElementString(
"fieldNAME", myNamespace, fileName);
                    writer.WriteEndElement();
                    writer.Close();
                }
                

            }

int group2NodesCount = rows.Count;

            XPathNavigator firstGroup2NodeNav 

= domNav.SelectSingleNode("/my:myFields/my:group3/my:group5[1]",
            NamespaceManager);

            XPathNavigator lastGroup2NodeNav 

= domNav.SelectSingleNode("/my:myFields/my:group3/my:group5[" + group2NodesCount.ToString() + "]", NamespaceManager);

            firstGroup2NodeNav.DeleteRange(lastGroup2NodeNav);

        }

删除事件,主要处理了对文档库文件的删除以及infopath表单重复表行的删除,都是比较基本的操作

public void CTRL18_5_Clicked(object sender, ClickedEventArgs e)
        {
            
// 在此处编写代码。
            string strfileUrl = e.Source.SelectSingleNode("/my:myFields/my:group6/my:group7/my:fieldURL", NamespaceManager).Value;
            SPSecurity.RunWithElevatedPrivileges(
delegate()
            {
                
try
                {
                    
using (SPSite mySite = new SPSite("http://ascentn-moss:8080"))
                    {

                        mySite.AllowUnsafeUpdates 

= true;
                        SPWeb webs 
= mySite.OpenWeb();
                        webs.AllowUnsafeUpdates 
= true;
                        webs.GetFile(strfileUrl).Delete();

                    }
                }

catch (Exception ex)
                {
                    
throw ex;
                }
            });
            e.Source.DeleteSelf();
        }

到这里基本的东西就是这些了,关于infopath表单设计这里就不提了