0

我正在尝试使用 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 );
4

0 回答 0