You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:27:42