我正在尝试使用 Atlassian REST API(Java 中)将(非空)PDF 上传到 Confluence。我遇到的问题是最终上传的 PDF 没有内容,但文件大小与原始 PDF 文档完全相同!
这是我用来编写请求内容的代码:
private String generateUploadContent( final ByteArrayInputStream is,
final String fileName,
final String boundary )
throws Exception
{
final String newLine = "\r\n";
final StringWriter writer = new StringWriter();
writer.write( "--" + boundary + newLine );
writer.write(
"Content-Disposition: form-data; name=\"file\"; filename=\"" +
fileName + "\"" + newLine );
if( fileName.endsWith( ".pdf" ) )
{
writer.write( "Content-Type: application/pdf" + newLine );
}
else
{
writer.write( "Content-Type: text/plain" + newLine );
}
writer.write( "Content-Transfer-Encoding: binary" + newLine + newLine );
IOUtils.copy( is, writer );
writer.write( newLine );
writer.write( "--" + boundary + "--" + newLine );
return writer.toString();
}
ByteArrayInputStream 'is' 是我尝试上传的文件的输入流。此代码非常适用于纯文本文件,但不适用于 PDF。
如果我执行以下操作,我系统上的结果文件是一个包含所有预期内容的 PDF,所以我知道输入流很好:
final File file = new File( "C:/file.pdf" );
final FileOutputStream fos = new FileOutputStream( file );
IOUtils.copy( is, fos );
以下是我也发送的完整标头列表,其中包含上面生成的内容作为请求的一部分:
Authorization: Basic <!AUTH STUFF!>
X-Atlassian-Token: no-check
Content-Type: multipart/form-data; boundary=<!BOUNDARY!>
根据我迄今为止的研究(已经相当广泛!),常见的建议似乎与:
- 使用“Cache-Control: no-cache”标头
- 提供/不提供“Content-Length”标头
- 与 PDF 内容转换为字符串时的编码有关(显然,相同的文件大小表明这是一个问题)
我只是对上面的最后一个解决方案有一个很好的破解,但没有成功。
IOUtils.copy( is, writer, StandardCharsets.UTF_8 );
其他两个解决方案在我阅读的任何论坛中都没有取得太大成功,所以我没有尝试过。
如果有人有替代解决方案,或者可以对所提供的任何解决方案提供更深入的了解,我将不胜感激。我花了太长时间试图自己解决这个问题。
如果有帮助,这里是我基于我的代码的 Atlassian REST API 参考:https ://docs.atlassian.com/atlassian-confluence/REST/latest-server/#content/{id}/child/attachment-创建附件
我尝试使用建议的 cURL 命令将相同的文件上传到同一页面,并且文件上传正常并包含预期的内容,它只是我的 Java 代码似乎在某处出错。
在此先感谢,
亚当
编辑:我在 base64 编码方面的失败尝试:
if( fileName.endsWith( ".pdf" ) )
{
writer.write( "Content-Type: application/pdf" + newLine );
writer.write( "Content-Transfer-Encoding: base64" + newLine + newLine );
final byte[] base64Bytes = Base64.encodeBase64( IOUtils.toByteArray( is ) );
final String base64String = new String( base64Bytes );
writer.write( base64String );
}
else
{
writer.write( "Content-Type: text/plain" + newLine );
writer.write( "Content-Transfer-Encoding: binary" + newLine + newLine );
IOUtils.copy( is, writer );
}
writer.write( newLine );
writer.write( "--" + boundary + "--" + newLine );