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

使用Mirth Connect发送PDF时遭遇HTTP 415「不支持文件类型」错误

Mirth Connect发送PDF文件遇415错误排查

我在使用Mirth Connect自动化医疗数据处理流程时,遇到一个问题:需要将接收到的base64格式PDF字符串转换为文件后通过HTTP发送,但持续收到415错误,服务器提示PDF附件文件类型不支持。

错误响应如下:

{
    "StatusCode": 415,
    "Message": "Unsupported tempFile8297956747860069271.pdf attachment file",
    "Success": false,
    "UserMessage": "The tempFile8297956747860069271.pdf attachment is unsupported, please select PDF files only.",
    "MemberValidation": null,
    "Error": []
}

我已经手动验证过该base64字符串可以转换为有效PDF文件,但服务器始终无法识别其合法性。求问可能的错误原因及解决方法?

相关代码如下:

function base64ToBytes(base64String) {
    var decoder = java.util.Base64.getDecoder();
    return decoder.decode(base64String);
}

function writeBytesToFile(bytes) {
    var tempFile = java.io.File.createTempFile("tempFile",".pdf");
    var outputStream = new java.io.FileOutputStream(tempFile);
    outputStream.write(bytes);
    outputStream.close();
    return tempFile;
}

function postFileToUrl(file) {
    var url = "https://....";
    var username = $('USERNAME'); 
    var password = $('PASSWORD'); 

    var httpClient = new org.apache.commons.httpclient.HttpClient();
    var postMethod = new org.apache.commons.httpclient.methods.PostMethod(url);

    postMethod.setRequestHeader("Username", username);
    postMethod.setRequestHeader("Password", password);

    var filePart = new org.apache.commons.httpclient.methods.multipart.FilePart("file",file.getName(),file,"application/pdf","UTF-8");
    filePart.setContentType("application/pdf"); 
    var multipart = new org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity([filePart],postMethod.getParams());

    postMethod.setRequestEntity(multipart);

    var responseCode = httpClient.executeMethod(postMethod);
    var responseBody = postMethod.getResponseBodyAsString();

    if (responseCode == 200) {
        logger.info("File uploaded successfully. Response: " + responseBody);
    } else {
        logger.error("Failed to upload file. Response: " + responseBody);
    }
    return responseBody;
}

var base64String = $('file');
var bytes = base64ToBytes(base64String);
var tempFile = writeBytesToFile(bytes);
response = postFileToUrl(tempFile)
tempFile.delete();

return response;

可能的原因及解决方法

1. 服务器验证PDF文件签名而非仅依赖MIME类型

多数服务器会检查文件的头部签名(PDF标准以%PDF-开头),而非仅信任请求中的Content-Type字段。可以添加代码验证写入的文件是否符合标准:

// 在writeBytesToFile函数中,写入文件后添加以下代码
var fis = new java.io.FileInputStream(tempFile);
var header = new java.lang.String(fis.readNBytes(5));
logger.info("PDF文件头部: " + header);
fis.close();

如果输出不是%PDF-,说明base64字符串可能包含多余前缀(如data:application/pdf;base64,),需要先去除前缀再解码。

2. Multipart请求的文件字段名不匹配

服务器可能期望的文件字段名不是file(比如attachment或pdfFile)。可以通过Postman手动上传测试,确认正确的字段名后,修改FilePart构造器的第一个参数:

var filePart = new org.apache.commons.httpclient.methods.multipart.FilePart("attachment",file.getName(),file,"application/pdf","UTF-8");

3. 跳过临时文件直接发送字节数组

写入临时文件的过程可能引入异常(如文件系统权限、临时文件被篡改),可以直接使用ByteArrayPart替代FilePart,减少中间环节:

// 替换postFileToUrl中的FilePart相关代码
var byteArrayPart = new org.apache.commons.httpclient.methods.multipart.ByteArrayPart("file", bytes, "document.pdf", "application/pdf");
var multipart = new org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity([byteArrayPart], postMethod.getParams());

4. 手动指定Multipart请求边界

旧版本commons-httpclient自动生成的边界可能导致服务器解析异常,可手动设置边界:

var params = postMethod.getParams();
params.setParameter(org.apache.commons.httpclient.params.HttpMethodParams.MULTIPART_BOUNDARY, "----CustomPDFBoundary123");
var multipart = new org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity([filePart], params);

内容的提问来源于stack exchange,提问作者Mohammad Rabia Najib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:50:57