使用PowerApps相机控件上传SharePoint附件丢失且新建行如何解决
问题根因
- 新建行问题:你调用
Patch函数时传入了第二个参数Defaults(BeckTable),该参数的作用就是指定Patch操作创建一条全新的列表记录,因此不会更新原有行。 - 图片失效问题:你存储的
First(CameraImage).Url是PowerApp运行时的临时内存链接,仅在当前应用会话内有效,应用关闭后内存资源释放,链接自然失效;且你未将图片实体作为SharePoint列表附件存储,仅存了临时路径,自然无法持久访问。
修复方案
前置准备
先确认你的SharePoint列表BeckTable已经开启附件功能,且PowerApp中该数据源的字段配置已经勾选了Attachments字段。
代码修改
- 拍照触发代码无需调整,保持原有逻辑即可:
ClearCollect(CameraImage,Camera1.Photo); UpdateContext({PhotoDateTime: Now()})
- 上传按钮代码替换,将临时图片作为附件写入指定现有行,不需要新建记录:
如果你是在浏览界面选中了对应用户的行,可先在浏览画廊控件的OnSelect属性添加逻辑Set(SelectedUser, ThisItem),上传按钮代码修改为:
Patch( BeckTable, SelectedUser, // 传入要更新的现有行对象,不要用Defaults,就不会生成新行 { Attachments: AddColumns( RenameColumns(First(CameraImage), "Value", "ContentBytes"), "@odata.type", "", "DisplayName", TextInput1.Text & "_" & Text(PhotoDateTime, "yyyy-mm-dd_hhMMss") & ".jpg", "Id", "" ) } )
如果不需要选中行,也可以直接按姓名匹配定位目标行:
Patch( BeckTable, LookUp(BeckTable, Title = TextInput1.Text), // 按Title字段匹配到对应用户的已有行 { Attachments: AddColumns( RenameColumns(First(CameraImage), "Value", "ContentBytes"), "@odata.type", "", "DisplayName", TextInput1.Text & "_" & Text(PhotoDateTime, "yyyy-mm-dd_hhMMss") & ".jpg", "Id", "" ) } )
- 图片展示逻辑修改,直接读取SharePoint行的附件链接,该链接是持久有效的:
First(LookUp(BeckTable, Title = TextInput1.Text).Attachments).AbsoluteUri
注意事项
- 如果你的列表允许多个附件,可以修改上述展示代码的筛选逻辑,定位到你需要展示的对应附件即可。
- 确保用户账号对SharePoint列表
BeckTable有编辑和添加附件的权限,避免操作被拦截。
内容的提问来源于stack exchange,提问作者shampouya
相关产品推荐
相关产品推荐

