使用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
相关产品推荐
相关产品推荐

