2016-05-17 26 views
0

フォーラム返信を投稿するには、書込みサーバー側の部分が必要です。私は返信テキスト付きの投稿要求と、base64でエンコードされた文字列である添付ファイルを受け取ります。このbase64文字列からファイル名と拡張子を復元する方法はありますか、またはそれらを追加のparamsとして要求する必要がありますか? base64の文字列として添付ファイルを投稿するのは正しい方法ですか?Base64エンコーディングからファイル名と拡張子を復元する

EDIT

それは春のWebサービスですが、私はPOSTリクエストを期待しています。今のところ私はx-www-form-urlencodedエンコーディングを使用していて、メッセージとエンコードされたファイルがフォーム本体の一部であることを期待しています。しかし、必要に応じてエンコーディングタイプを変更することができます。 サーバー側では、requestParamsマップとして取得し、このマップからエンコードされたStringを抽出します。

+0

私たちはもっと情報が必要だと思います。これはあなたが話している 'multipart/form-data'エンコーディングのHTMLフォームPOSTですか?もしそうなら、あなたはそれを読むためにどのようなテクノロジーをサーバー側で使用していますか?質問を編集して明確にしてください。 – Andreas

+0

私は編集した質問をしました。 – user2281439

+0

ファイルを受信できるようにしたい場合は、x-www-form-urlencodedを使用することはできません。このためにmultipart/form-dataが一般的に使用されています –

答えて

1

ファイル名/拡張子がbase64でエンコードされた文字列(メッセージなど)に含まれていない場合は、復元する方法はないと思います(コンテキストによって異なる場合があります)。別のエンコーディングタイプを使用してもそれは変更されません。例えばクライアントはファイル名/拡張子を指定し、サーバーがそれを使用できるようにする前に、要求(パラメータまたはエンコードされたコンテンツのいずれか)にそれを含める必要があります。

+0

要求するパラメータとしてファイル名を追加しました – user2281439

-1

POST要求のHTTP要求では、content-dispositionヘッダーフィールドを使用して、メッセージ本文とは別にファイル名を転送する必要があります。このように:

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

POST'ing側が、ファイル名を決定する方法を、このヘッダフィールドを送信しないしない場合。それを含むbase64でコード化されたペイロードのいくつかのフォーマットに合意していない限り。

+0

'response.setHeader()'はサーバーからの応答用です。ファイルがダウンロードされました。質問はファイル*アップロード*に関するものです。 – Andreas

+0

確かに。あなたが正しい。これを指摘してくれてありがとう。 – tbsalling

0

Apache Tikaを使用すると、最も一般的なファイルのmime-typeファイルを取得できます。ファイル拡張子は(ファイル名ではなく...)抽出できます。これは、TikaがMIMEタイプを検出できる場合に機能します。その後、mime-typeを必要なファイル拡張子に変換することができます。いくつかの共通のコードについては私のコードを参照してください。 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; 
     } 
関連する問題