使用Agent与LotusScript从POST请求中获取附件
解决Domino Web表单文件上传的LotusScript处理方案
我之前处理过Domino Web表单上传文件的需求,正好能帮到你!问题出在两个关键环节:你的表单缺少文件上传必需的编码配置,且Domino不会自动把文件内容注入DocumentContext,得手动解析Web请求的原始内容。
第一步:修复表单的编码设置
首先要给你的表单加上enctype="multipart/form-data"属性——这是文件上传的必要条件,没有它服务器根本接收不到文件的二进制内容。修改后的表单代码如下:
<form name="profile" method="POST" action=".../postAgentName?openagent" enctype="multipart/form-data"> <input name="title"/> <input name="price"/> ... <input type="file" name="files" multiple> </form>
第二步:用LotusScript解析上传的文件内容
Domino会把multipart格式的请求内容存在NotesRequest对象里,我们需要通过它获取原始数据,然后分割解析出文件部分。以下是完整的Agent代码示例,包含文件提取、保存到文档的逻辑:
Sub Initialize Dim session As New NotesSession Dim doc As NotesDocument Dim request As NotesRequest Dim content As String Dim boundary As String Dim parts() As String Dim i As Integer Dim partContent As String Dim fileName As String Dim fileContentStart As Integer Dim fileContent As String Dim stream As NotesStream Dim attachment As NotesEmbeddedObject ' 获取上下文文档和请求对象 Set doc = session.DocumentContext Set request = session.GetHttpRequest() ' 校验请求类型是否为multipart/form-data If InStr(request.ContentType, "multipart/form-data") = 0 Then Print "错误:表单必须设置enctype='multipart/form-data'" Exit Sub End If ' 提取multipart分隔符(boundary) boundary = Mid(request.ContentType, InStr(request.ContentType, "boundary=") + 9) boundary = "--" & boundary ' 获取请求的原始内容 content = request.Content ' 按分隔符分割成各个表单字段/文件部分 parts = Split(content, boundary) ' 遍历所有部分,寻找名为"files"的文件控件内容 For i = LBound(parts) To UBound(parts) partContent = parts(i) ' 判断当前部分是否是files控件的文件内容 If InStr(partContent, "name=""files""") > 0 And InStr(partContent, "filename=""") > 0 Then ' 提取文件名 fileName = Mid(partContent, InStr(partContent, "filename=""") + 10) fileName = Left(fileName, InStr(fileName, """") - 1) ' 定位文件内容的起始位置(跳过头部的HTTP头信息,找到空行后的内容) fileContentStart = InStr(partContent, Chr(13) & Chr(10) & Chr(13) & Chr(10)) + 4 ' 提取文件内容,去掉末尾的分隔符和换行 fileContent = Mid(partContent, fileContentStart) fileContent = Left(fileContent, Len(fileContent) - Len(Chr(13) & Chr(10) & "--")) ' 创建流对象,写入文件内容并保存为文档附件 Set stream = session.CreateStream() Call stream.WriteText(fileContent, 0) ' 0表示按原始字节写入,避免编码干扰 Set attachment = doc.CreateEmbeddedObject("", fileName) Call attachment.ExtractFile(stream) Call stream.Close() Print "文件上传成功:" & fileName End If Next i ' 保存文档(如果需要持久化附件) Call doc.Save(True, False) End Sub
关键注意事项
- 权限问题:确保Agent的运行账号拥有创建附件和保存文档的权限,否则会抛出权限错误。
- 大文件处理:如果上传大文件,直接读取整个
request.Content可能导致内存不足,建议改用流的方式分块解析。 - 编码兼容:
WriteText的第二个参数设为0是为了按原始字节写入,避免字符编码转换破坏二进制文件(比如图片、压缩包)。
内容的提问来源于stack exchange,提问作者Dmytro Pastovenskyi
相关产品推荐
相关产品推荐

