使用Ansible URI模块上传文件至ServiceNow后下载损坏问题求助
问题分析与解决
我使用Ansible结合URI模块将PDF或CSV文件附加到ServiceNow现有事件中,上传过程无异常,但下载同一附件时,CSV会出现乱码或加密状态,PDF则提示无法加载。手动通过ServiceNow REST API Explorer或UI上传并下载该文件时一切正常,问题出在Ansible上传代码中。
错误代码
- name: "Attach output CSV file to incident" ansible.builtin.uri: url: "{{ SN_HOST }}api/now/attachment/upload" user: "{{ SN_USERNAME }}" password: "{{ SN_PASSWORD }}" method: POST return_content: true validate_certs: false force_basic_auth: no status_code: 201 body_format: form-multipart headers: Accept: 'application/json' Content-Type: 'multipart/form-data' body: table_name: content: incident table_sys_id: content: 'c6957640470388444c736d4315' uploadFile: filename: "../../win_playbooks/reports/User_Manual.pdf" register: attach_file
报错现象
- PDF打开报错:无法加载文档,提示文档损坏
- CSV打开后乱码,或显示为加密状态
解决方法
修正两处关键错误即可解决问题:
1. 移除手动设置的Content-Type头
当body_format设为form-multipart时,Ansible会自动生成包含正确boundary的Content-Type头,手动设置该头会破坏multipart格式的解析逻辑,导致文件内容损坏。
2. 替换uploadFile字段的参数
将filename改为src:src用于指定本地文件路径,Ansible会读取文件的实际内容进行上传;单独使用filename只会把路径字符串作为内容上传,而非文件本身,这是文件损坏的核心原因。
修正后的代码:
- name: "Attach output CSV file to incident" ansible.builtin.uri: url: "{{ SN_HOST }}api/now/attachment/upload" user: "{{ SN_USERNAME }}" password: "{{ SN_PASSWORD }}" method: POST return_content: true validate_certs: false force_basic_auth: no status_code: 201 body_format: form-multipart headers: Accept: 'application/json' body: table_name: content: incident table_sys_id: content: 'c6957640470388444c736d4315' uploadFile: src: "../../win_playbooks/reports/User_Manual.pdf" # 可选:如需自定义附件显示名称,添加此行 # filename: "Custom_User_Manual.pdf" register: attach_file
验证
上传完成后,可通过ServiceNow查询附件的文件大小,确认与本地文件一致,说明上传内容正确。
内容的提问来源于stack exchange,提问作者user12007109
相关产品推荐
相关产品推荐

