2016-12-13 10 views
2

ファイル拡張子をHTTPヘッダーに追加できますか?API呼び出しのファイル拡張子のHTTPヘッダーパラメーター

API呼び出しを使用してファイルを送信するプログラムを開発しました。 ファイルがの.docまたは.PDFに限定されることはありません、それは同様.exeのまたは.zipの拡張子を持つことができます。

ファイルが正常にサーバーにアップロードしますが、ファイルの拡張子が正しくないようです、私は別のファイルの種類を期待していながら、それは、データとして、ファイルの種類を示しています。アップロード部分のサンプルコードソースダウンここ

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost("http://ServerName:Port/Anything/data"); //remote API URL 
String filepath = "C://User//test//"; 
String file1 = filepath.concat(file); 
System.out.println("Sending the file"); 
FileBody bin = new FileBody(new File(file1)); // take the file from directory 
HttpEntity reqEntity = MultipartEntityBuilder.create() 
     .addPart("display_name", (ContentBody) bin) 
     .build(); 
post.addHeader("filename", file1); 
post.setEntity(reqEntity); // send via post method 



ファイルボディは、同様に、ファイルの拡張子を読みますか?

+0

サーバーからコードリターンをエラーではありません、ファイルは、ASCIIファイルを検出することができますが、種類を提出、それは他人のために失敗しています私のサーバー – attack

答えて

1

としてFileBodyオブジェクトを構築し、別名MIMEタイプ、あなたは2つの引数またはその代わりに1、引数1のFielBodyの3つの引数のコンストラクタのいずれかを使用する必要がありますあなたはすでに使用しています。次のように

それはあなたのファイルの種類に応じて、何かする必要があります:

FileBody bin = new FileBody(new File(file1), ContentType.DEFAULT_BINARY); 
+0

私はあなたのコードに、任意のアイデアを追加した後も同じ問題はまだですか? – attack

+0

@attackそのアイデアは簡単です。あなたはシステムではなく、 "ファイル拡張子"を提供する責任があります。それのまわりには道がない。 –

+0

@MargaretBloom - 私がファイルを読んでいる間は、ファイル拡張子も一緒に入れる必要がありますか?それはそれのようなものですか? – attack

0

(HttpServletRequest) request.getHeader("Content-Disposition")を使用してヘッダーリストからContent-Dispositionヘッダーを抽出します。これにより、ファイル名は最後にContent-Disposition: form-data; name="uploadedfile"; filename="file.ext"となります。

ここからファイルの種類を抽出できます。

また方法でそれを行うことができます。

String fileName = uploadedFile.getFileName(); 
String mimeType = getServletContext().getMimeType(fileName); 
if (mimeType.startsWith("text/")) { 
    // It's a text. 
}else if(mimeType.startsWith("image/")){ 
    // It's an image. 
} 

を、それがお役に立てば幸いです。

0

書面では、FileBodyon the relevant repoの3つのコンストラクタのソースコードが見つかります。

public FileBody(final File file) { 
    this(file, ContentType.DEFAULT_BINARY, file != null ? file.getName() : null); 
} 

/** 
* @since 4.3 
*/ 
public FileBody(final File file, final ContentType contentType, final String filename) { 
    super(contentType); 
    Args.notNull(file, "File"); 
    this.file = file; 
    this.filename = filename == null ? file.getName() : filename; 
} 

/** 
* @since 4.3 
*/ 
public FileBody(final File file, final ContentType contentType) { 
    this(file, contentType, file != null ? file.getName() : null); 
} 

デフォルトはContentType.DEFAULT_BINARYあるcontentTypeを指定しない場合。
すべてのOSがファイル拡張子を使用するわけではないので、「ファイルタイプ」を定義するコンテンツタイプです。


Linuxシステムで実行している場合は、ファイルのMIMEタイプを取得するためにHow can I find out a files “mime-type(Content-Type?)”?を参照してください。
Windows equivalent questionもあります。

コンテンツタイプがcontentTypeになったら、正しいコンストラクタ:new FileBody(new File(file1), ContentType.create(contentType));を使用します。
エンコード情報も追加することができます(ContentTypeを参照)。


あなたが実行しているどのようなサーバーを指定しませんでしたが、ファイルのMIMEタイプを検出するための労働に入る前に、あなたがハードコーディングさMIMEタイプを置くことで構成される簡単なテストを行うことができます要求。
は、単にファイルの種類を指定するために

FileBody bin = new FileBody(new File(file1), ContentType.create("image/png")); 
+0

に達し、何か案が? – attack

+0

@attack [mcve]がなければ、サーバー側のコードは分かりにくいです。 –

+1

あなたの援助をありがとう、それは今解決した – attack

関連する問題