从base64编码恢复文件名和扩展

问题描述:

我需要写服务器端部分发布论坛回复。我收到一封包含回复文本的邮件请求,并附有一个base64编码的字符串。有没有办法从这个base64字符串恢复文件名和扩展名,或者我需要将它们作为请求中的附加参数?以base64字符串的形式发布附件是否正确?从base64编码恢复文件名和扩展

编辑

这是一个春季的web服务,我期待着发布请求。现在我正在使用x-www-form-urlencoded编码,并希望消息和编码文件成为表体的一部分。但编码类型可以根据需要进行更改。 在服务器端,我只是将它作为requestParams映射检索,并从此映射中提取编码的String。

+0

我想我们需要更多信息。这是一个HTML表单POST,其中包含您正在讨论的'multipart/form-data'编码吗?如果是这样,你在服务器端使用什么技术来读取它?请编辑问题以澄清。 – Andreas

+0

我编辑过的问题。 – user2281439

+0

如果你想能够接收文件,我不认为你可以使用x-www-form-urlencoded。 multipart/form-data通常用于这个 –

如果文件名/扩展名未包含在base64编码字符串中(例如在消息中),我不认为有一种方法可以恢复它(可以取决于上下文)。使用另一种编码类型不会改变它;例如客户端必须指定文件名/扩展名,并在服务器使用它之前将其包含在请求中(作为参数或在编码内容中)。

+0

我添加了文件名作为参数请求 – user2281439

在POST请求的HTTP请求中,您需要使用content-disposition标头字段将消息正文与文件名分开。像这样:

response.setHeader("Content-Disposition", "attachment;filename=" + filename); 

如果POST'ing端没有传送此标头字段,则无法确定文件名。除非你已经同意包含它的base64编码有效载荷的一些格式。

+0

'response.setHeader()'是针对服务器的响应,所以文件下载。问题是关于文件*上传*。 – Andreas

+0

确实。你是对的。感谢您指出了这一点。 – tbsalling

使用Apache Tika你可以得到大多数常见文件的文件MIME类型,并从中可以提取文件扩展名(不是文件名,但是...)。如果Tika可以检测到MIME类型,这将起作用。之后,您可以将MIME类型转换为想要的文件扩展名。查看我的代码以查看一些常见的代码阅读关于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 = changeFileType(fileType);      
      File tempFile = File.createTempFile("MyFile", "." +fileExtension); 
    } 

    private String changeFileType(String fileType) { 

      boolean cahnged = false; 
      if (fileType.subSequence(0, 5).equals("image")) { 
       fileType = fileType.substring(6, fileType.length()); 
      } 
      if (fileType.contains("PDF")) { 
       fileType = "pdf"; 
       cahnged = true; 
      } 
      if (fileType.contains("msword")) { 
       fileType = "doc"; 
       cahnged = true; 
      } 
      if (fileType.contains("wordprocessingml")) { 
       fileType = "docx"; 
       cahnged = true; 
      } 

      if (fileType.contains("excel")) { 
       fileType = "xls"; 
       cahnged = true; 
      } 
      if (cahnged){ 
       log.debug("Changed fileType to: ["+fileType+"]"); 
      } 
      return fileType; 
     }