Java 1.6 编码 Excel 文件 byte[] 流的 Base64 输入流
Java 1.6 Encode Base64 inputStream of a Excel file byte[] stream
我一直在网上搜索这个特定问题。也许我做错了什么或者我在这里遗漏了什么...
所以我正在尝试转换文件流(Excel 文件)-> mimetype(application/octet-stream 或 application/vnd.ms-excel)不无关紧要...对于 Base64 编码的字符串。
我这样做的原因是因为我想在 JSON 对象内的 REST API 中提供文件,以便稍后在浏览器中解码 base64 字符串并下载文件。
当我收到 InputStream 并将其保存到磁盘时,一切正常...
即使我使用 POSTMAN 获取文件,如果我保存文件,它也会在 Excel 中打开所有正确的数据。
代码 -> 使用这个简单的 example 从 URL
下载文件
URL url = new URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
//etc...i get response code OK(200) get file name etc
// opens input stream from the HTTP connection
InputStream inputStream = httpConn.getInputStream();
String saveFilePath1 = "C:\test1.xlsx";
String saveFilePath2 = "C:\test2.xlsx";
FileOutputStream outputStream = new FileOutputStream(saveFilePath1);
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
//FOR TESTING PURPOSES AT THIS POINT I HAVE SAVED THE STREAM INTO
//**test1.xlsx** SUCCESSFULLY and opens into excel and everything
//is fine.
//THE PROBLEM RESIDES HERE IN THIS NEXT PIECE OF CODE
//import org.apache.commons.codec.binary.Base64;
//I try to encode the string to Base64
String encodedBytesBase64 = Base64.encodeBase64String(buffer);
//WHEN I DO THE DECODE AND WRITE THE BYTES into test2.xlsx this file doesn´t work...
FileOutputStream fos = new FileOutputStream(saveFilePath2);
byte[] bytes = Base64.decodeBase64(encodedBytesBase64);
fos.write(bytes);
//Close streams from saved file test2
fos.close();
//Close streams from saved file test1
outputStream.close();
inputStream.close();
我什至拿了这个字符串来检查它是否是一个有效的 Base64 字符串,它符合这个网站 -> Base64 Validator
但是当我尝试解码同一网站中的字符串时,它告诉我存在不同的编码:
这可能是问题所在吗?
我认为您可以忽略这些警告。相反,问题在这里:
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
:
String encodedBytesBase64 = Base64.encodeBase64String(buffer);
正如您在第一部分中看到的,您正在重复使用 buffer
来读取输入流并写入输出流。如果循环不止一次,buffer
将被输入流中的下一个数据块覆盖。因此,当您编码 buffer
时,您仅使用文件的最后一块。
下一个问题是,当您编码时,您正在对整个缓冲区数组进行编码,而忽略了 bytesRead
。
一个选项可能是读取 inputStream 并将其写入 ByteArrayOutputStream,然后对其进行编码。
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayOutputStream array = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
array.write(buffer, 0, bytesRead);
}
String encoded = Base64.encodeBase64String(array.toByteArray());
我一直在网上搜索这个特定问题。也许我做错了什么或者我在这里遗漏了什么...
所以我正在尝试转换文件流(Excel 文件)-> mimetype(application/octet-stream 或 application/vnd.ms-excel)不无关紧要...对于 Base64 编码的字符串。
我这样做的原因是因为我想在 JSON 对象内的 REST API 中提供文件,以便稍后在浏览器中解码 base64 字符串并下载文件。
当我收到 InputStream 并将其保存到磁盘时,一切正常...
即使我使用 POSTMAN 获取文件,如果我保存文件,它也会在 Excel 中打开所有正确的数据。
代码 -> 使用这个简单的 example 从 URL
下载文件URL url = new URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
//etc...i get response code OK(200) get file name etc
// opens input stream from the HTTP connection
InputStream inputStream = httpConn.getInputStream();
String saveFilePath1 = "C:\test1.xlsx";
String saveFilePath2 = "C:\test2.xlsx";
FileOutputStream outputStream = new FileOutputStream(saveFilePath1);
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
//FOR TESTING PURPOSES AT THIS POINT I HAVE SAVED THE STREAM INTO
//**test1.xlsx** SUCCESSFULLY and opens into excel and everything
//is fine.
//THE PROBLEM RESIDES HERE IN THIS NEXT PIECE OF CODE
//import org.apache.commons.codec.binary.Base64;
//I try to encode the string to Base64
String encodedBytesBase64 = Base64.encodeBase64String(buffer);
//WHEN I DO THE DECODE AND WRITE THE BYTES into test2.xlsx this file doesn´t work...
FileOutputStream fos = new FileOutputStream(saveFilePath2);
byte[] bytes = Base64.decodeBase64(encodedBytesBase64);
fos.write(bytes);
//Close streams from saved file test2
fos.close();
//Close streams from saved file test1
outputStream.close();
inputStream.close();
我什至拿了这个字符串来检查它是否是一个有效的 Base64 字符串,它符合这个网站 -> Base64 Validator
但是当我尝试解码同一网站中的字符串时,它告诉我存在不同的编码:
这可能是问题所在吗?
我认为您可以忽略这些警告。相反,问题在这里:
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
:
String encodedBytesBase64 = Base64.encodeBase64String(buffer);
正如您在第一部分中看到的,您正在重复使用 buffer
来读取输入流并写入输出流。如果循环不止一次,buffer
将被输入流中的下一个数据块覆盖。因此,当您编码 buffer
时,您仅使用文件的最后一块。
下一个问题是,当您编码时,您正在对整个缓冲区数组进行编码,而忽略了 bytesRead
。
一个选项可能是读取 inputStream 并将其写入 ByteArrayOutputStream,然后对其进行编码。
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayOutputStream array = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
array.write(buffer, 0, bytesRead);
}
String encoded = Base64.encodeBase64String(array.toByteArray());