1

javaで残りのAPIを使ってスカイドライブにファイルをアップロードしてみました。

これが私のコードです:

    public void UploadFile(File upfile) {
    if (upload_loc == null) {
        getUploadLocation();
    }

    HttpClient client = new DefaultHttpClient();
    client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    HttpPost post = new HttpPost(upload_loc + "?" + "access_token=" + access_token);
    try {

        MultipartEntity mpEntity = new MultipartEntity(null,"A300x",null);
        ContentBody cbFile = new FileBody(upfile, "multipart/form-data");
        mpEntity.addPart("file", cbFile);

        post.setEntity(mpEntity);
        System.out.println(post.toString());
        HttpResponse response = client.execute(post);
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line2 = "";
        while ((line2 = rd.readLine()) != null) {
            System.out.println(line2);
        }

    } catch (IOException ex) {
        Logger.getLogger(Onlab.class.getName()).log(Level.SEVERE, null, ex);
    }
    client.getConnectionManager().shutdown();

}

しかし、実行しようとすると、次のエラーが発生します。

{
"error": {
  "code": "request_body_invalid", 
  "message": "The request entity body for multipart form-data POST isn't valid. The expected format is:\u000d\u000a--[boundary]\u000d\u000aContent-Disposition: form-data; name=\"file\"; filename=\"[FileName]\"\u000d\u000aContent-Type: application/octet-stream\u000d\u000a[CR][LF]\u000d\u000a[file contents]\u000d\u000a--[boundary]--[CR][LF]"
 }
}

私の最大の問題は、リクエスト自体が表示されないことです。そのための使用可能な toString メソッドが見つかりませんでした。この強制境界形式を試しましたが、空のコンストラクターでも試しました。

私のファイルは現在、いくつかのテキストを含む txt です。境界が主な問題であるか、さらにいくつかのパラメーターを構成する必要があると思います。デバッグ モードで変数を見ると、すべて msdn のガイドと同じように見えます。

私は残りの世界では新しいので、可能であれば、このApache libを使いやすいHttpClientおよびHttpPostクラスで維持したいと考えています。

よろしくお願いします。私の英語で申し訳ありません。

編集:わかりました、長い睡眠の後、POST の代わりに PUT メソッドを試すことにしました。コードは最小限の変更で正常に動作します。

public void UploadFile(File upfile) {
    if (upload_loc == null) {
        getUploadLocation();
    }
    HttpClient client = new DefaultHttpClient();
    client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    String fname=upfile.getName();
    HttpPut put= new HttpPut(upload_loc +"/"+fname+ "?" + "access_token=" + access_token);
    try {
        FileEntity reqEntity=new FileEntity(upfile);
        put.setEntity(reqEntity);
        HttpResponse response = client.execute(put);
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line2 = "";
        while ((line2 = rd.readLine()) != null) {
            System.out.println(line2);
        }
    } catch (IOException ex) {
        Logger.getLogger(Onlab.class.getName()).log(Level.SEVERE, null, ex);
    }
    client.getConnectionManager().shutdown();
}

しかし、最初の質問に対する答えはまだありません。

4

1 に答える 1

3

2つの簡単なこと:

  1. MultipartEntity本当に必要でない限り、オーバーロードされたコンストラクターを使用しないでください。この場合、文字セットを null に設定していますが、これはおそらく良い考えではありません。また、境界区切り文字が十分に複雑ではありません。

  2. ファイル本文のコンテンツ タイプは、アップロードされる実際のファイルのコンテンツを反映する必要があります。`multipart-formdata は通常、ファイルではなく HTML フォーム データに使用されます。これを「text/plain」、「image/jpeg」、またはファイルの真の MIME タイプを反映するものに変更する必要があります。

REST リクエストをデバッグするためのいくつかの優れたツール - REST コンソール (Chrome)REST クライアント (Firefox)

受け取ったエラー メッセージについて簡単に説明します。実際には、かなりの詳細が記載されています。サービスは、送信されるファイル部分に次のパラメータが設定されることを期待しています:

  • 名前:
  • ファイル名:
  • コンテンツ タイプ: アプリケーション/オクテット ストリーム

次のコードを使用して、HTTP クライアントにこれらのほとんどを設定させることができます。

ContentBody cbFile = new FileBody(
    upfile,
    "yourFileNameHere",
    "application/octet-stream",
    "UTF-8");
于 2013-03-05T23:59:20.497 に答える