从 base64 编码恢复文件名和扩展名
Restore filename and extension from base64 encoding
我需要将服务器端部分写入 post 论坛回复。我收到一个带有回复文本的 post 请求,附件是一个 base64 编码的字符串。有没有办法从此 base64 字符串恢复文件名和扩展名,或者我需要将它们作为请求中的附加参数? post 附件作为 base64 字符串的正确方法吗?
编辑
这是一个 spring 网络服务,我正在等待 Post 请求。现在我正在使用 x-www-form-urlencoded 编码并期望消息和编码文件成为表单主体的一部分。但如果需要,可以更改编码类型。
在服务器端,我只是将其检索为 requestParams 映射,并从该映射中提取编码字符串。
如果 filename/extension 未包含在 base64 编码字符串中(例如在消息中),我认为没有办法恢复它(可能取决于上下文)。使用另一种编码类型不会改变这一点;例如客户端必须指定 filename/extension 并将其包含在请求中(作为参数或在编码内容中),然后服务器才能使用它。
在被 POST 编辑的 HTTP 请求中,您需要使用 content-disposition header 字段将文件名与消息 body 分开传输。像这样:
response.setHeader("Content-Disposition", "attachment;filename=" + filename );
如果POST'ing 端不传输此header 字段,则无法确定文件名。除非您同意包含它的 base64 编码有效负载的某种格式。
使用 Apache Tika
您可以获得大多数常见文件的文件 mime-type,并且您可以从中提取文件扩展名。然后,您可以将 mime-type 转换为所需的文件扩展名。如果知道您只期望或希望允许某些类型,这将非常有用。
查看几乎所有常见的mime-types here。
了解 Tika 和 mime 类型 here.
private void findFileExtension(String base64) throws IOException {
byte[] base64Bytes = DataTypeConverter.parseBase64Binary(base64);
Tika tika = new Tika();
String fileType = tika.detect(base64Bytes);
String fileExtension = getMimeTypeMap().get(fileType);
File tempFile = File.createTempFile("MyFile", "." + fileExtension);
}
private Map<String, String> getMimeTypeMap() {
Map<String, String> mimeTypeMap = new HashMap<>();
mimeTypeMap.put("application/pdf", "pdf");
mimeTypeMap.put("application/msword", "doc");
mimeTypeMap.put("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx");
mimeTypeMap.put("application/vnd.ms-excel", "xls");
}
我需要将服务器端部分写入 post 论坛回复。我收到一个带有回复文本的 post 请求,附件是一个 base64 编码的字符串。有没有办法从此 base64 字符串恢复文件名和扩展名,或者我需要将它们作为请求中的附加参数? post 附件作为 base64 字符串的正确方法吗?
编辑
这是一个 spring 网络服务,我正在等待 Post 请求。现在我正在使用 x-www-form-urlencoded 编码并期望消息和编码文件成为表单主体的一部分。但如果需要,可以更改编码类型。 在服务器端,我只是将其检索为 requestParams 映射,并从该映射中提取编码字符串。
如果 filename/extension 未包含在 base64 编码字符串中(例如在消息中),我认为没有办法恢复它(可能取决于上下文)。使用另一种编码类型不会改变这一点;例如客户端必须指定 filename/extension 并将其包含在请求中(作为参数或在编码内容中),然后服务器才能使用它。
在被 POST 编辑的 HTTP 请求中,您需要使用 content-disposition header 字段将文件名与消息 body 分开传输。像这样:
response.setHeader("Content-Disposition", "attachment;filename=" + filename );
如果POST'ing 端不传输此header 字段,则无法确定文件名。除非您同意包含它的 base64 编码有效负载的某种格式。
使用 Apache Tika
您可以获得大多数常见文件的文件 mime-type,并且您可以从中提取文件扩展名。然后,您可以将 mime-type 转换为所需的文件扩展名。如果知道您只期望或希望允许某些类型,这将非常有用。
查看几乎所有常见的mime-types here。
了解 Tika 和 mime 类型 here.
private void findFileExtension(String base64) throws IOException {
byte[] base64Bytes = DataTypeConverter.parseBase64Binary(base64);
Tika tika = new Tika();
String fileType = tika.detect(base64Bytes);
String fileExtension = getMimeTypeMap().get(fileType);
File tempFile = File.createTempFile("MyFile", "." + fileExtension);
}
private Map<String, String> getMimeTypeMap() {
Map<String, String> mimeTypeMap = new HashMap<>();
mimeTypeMap.put("application/pdf", "pdf");
mimeTypeMap.put("application/msword", "doc");
mimeTypeMap.put("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "docx");
mimeTypeMap.put("application/vnd.ms-excel", "xls");
}