gpt4 book ai didi

java - 在 Java 中将 PDF 编码为 Base64,在 PL/SQL 中解码 : doesn't work

转载 作者:行者123 更新时间:2023-12-01 13:17:06 30 4
gpt4 key购买 nike

所以,我正在开发一个网络服务项目。

基本上,它可以归结为:

  1. PL/SQL 端上传 PDF 文件,然后对该文件进行 Base64 编码,然后将其发送到我的 REST Web 服务。
  2. Java Web 服务接收文件。我在执行其他操作之前保存此文件(仅用于测试):正如预期的那样,该文件已损坏(它是 Base64 字符串,这是正常的)。
  3. Java Web 服务对文件进行 Base64 解码,然后继续对文件执行需要执行的操作。解码后,我再次保存文件,它再次按预期工作,我能够打开并阅读 PDF。
  4. PL/SQL 现在请求重新下载文件。我重新编码该文件并将其发送回请求者。我在编码后保存文件,正如预期的那样(再次进行 Base64 编码):它不起作用(已损坏)。
  5. PL/SQL 接收文件,对文件进行 Base64 解码并尝试打开它...砰,损坏,无法读取文件。

通信之间可能出现问题:Java 中采用 Base64 编码,PL/SQL 中采用 Base64 解码。您可能会怀疑这没有什么区别,因为它使用的是标准(我猜 Base64 是标准,对吧?)。

我们尝试了两种选择:在用 Java 重新编码 PDF 后,我尝试再次重新解码并保存它;该文件是正确的,我可以阅读 PDF。所以我们假设Java 中的编码是正确的。我们还在 PL/SQL 中尝试过这一点 - 上传 BLOB、编码为 Base64、解码回来、下载并打开。这也有效。所以我们假设 PL/SQL 中的编码和解码部分也可以工作。

奇怪的是,我可以在 PL/SQL 中对文件进行 Base64 编码,然后用 Java 对其进行解码,然后保存并读取它。只有当我用 Java 重新编码该文件并尝试用 PL/SQL 对其进行解码时,才会出错。因此,在我看来,PL/SQL - Java 中使用的标准之间实际上不会存在问题,因为那样第一步也会失败。

我们使用 Java 中的公共(public)库 (org.apache.commons.codec.binary.Base64)。在 PL/SQL 中,我们尝试使用 UTL 包、自定义方法以及 Java 存储过程以及 Apex_webservice (apex_web_service.blob2clobbase64(p_blob) apex_web_service.clobbase642blob(p_clob))。它们都给出相同的结果。

我们的想法正在慢慢耗尽。还有人有其他更好的主意吗?

谢谢!

--- 编辑 ---

这是文件在 PL/SQL 中解码的方式:

FUNCTION encode_base64 (p_blob_in IN BLOB) 
RETURN CLOB IS
v_clob CLOB;
v_result CLOB;
v_offset INTEGER;
v_chunk_size BINARY_INTEGER := (48 / 4) * 3;
v_buffer_varchar VARCHAR2 (48);
v_buffer_raw RAW (48);
BEGIN
IF p_blob_in IS NULL THEN
RETURN NULL;
END IF;
DBMS_LOB.createtemporary (v_clob, TRUE);
v_offset := 1;
FOR i IN 1 .. CEIL (DBMS_LOB.getlength (p_blob_in) / v_chunk_size) LOOP
DBMS_LOB.read (p_blob_in, v_chunk_size, v_offset, v_buffer_raw);
v_buffer_raw := UTL_ENCODE.base64_encode (v_buffer_raw);
v_buffer_varchar := UTL_RAW.cast_to_varchar2 (v_buffer_raw);
DBMS_LOB.writeappend (v_clob, LENGTH (v_buffer_varchar), v_buffer_varchar);
v_offset := v_offset + v_chunk_size;
END LOOP;
v_result := v_clob;
DBMS_LOB.freetemporary (v_clob);
RETURN v_result;
END encode_base64;

这是文件在 Java 中的编码方式:

byte[] content = /*Here is my content in bytes. Before encoding, when I save, this is correct*/
Base64.encodeBase64String(content);

--- 编辑 2 ---

我不小心在上面的PL/SQL中添加了解码部分。这是 PL/SQL 中的编码部分。

function decode_base64(p_clob_in in clob) return blob is
v_blob blob;
v_result blob;
v_offset integer;
v_buffer_size binary_integer := 48;
v_buffer_varchar varchar2(48);
v_buffer_raw raw(48);
begin
if p_clob_in is null then
return null;
end if;
dbms_lob.createtemporary(v_blob, true);
v_offset := 1;
for i in 1 .. ceil(dbms_lob.getlength(p_clob_in) / v_buffer_size) loop
dbms_lob.read(p_clob_in, v_buffer_size, v_offset, v_buffer_varchar);
v_buffer_raw := utl_raw.cast_to_raw(v_buffer_varchar);
v_buffer_raw := utl_encode.base64_decode(v_buffer_raw);
dbms_lob.writeappend(v_blob, utl_raw.length(v_buffer_raw), v_buffer_raw);
v_offset := v_offset + v_buffer_size;
end loop;
v_result := v_blob;
dbms_lob.freetemporary(v_blob);
return v_result;
end decode_base64;

最佳答案

大多数此类问题都源于小事......

所以发生了什么?我将 Base64 字符串发送回 XML 中。在 PL/SQL 中,我们先将该字符串提取到 clob 中,然后再将其解码回 blob。

我们打印并检查了该字符串...它是正确的。

当我们尝试检查从 PL/SQL 发送的 clob 与在 PL/SQL 中返回的 clob 之间的差异时,我们发现了一些 char(10) 和 char(13) - 本质上是换行符。肉眼不可见,但会使 blob(和解码的 blob)损坏。翻译功能将这些内容翻译出来,现在它就像一个魅力。

感谢您的帮助!

关于java - 在 Java 中将 PDF 编码为 Base64,在 PL/SQL 中解码 : doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22385398/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com