0

Skydrive api ( http://msdn.microsoft.com/en-us/library/live/hh826531.aspx#uploading_files ) に従って、投稿要求の本文で画像のコンテンツを byte[] で渡します。ファイルの作成はskydriveサーバーで行われますが、skydriveで開くと、「ファイルが破損しているか破損している可能性があります」と表示されます。

投稿リクエストの本文

--A300x Content-Disposition: フォームデータ; 名前="ファイル"; filename="menu-icon.png" コンテンツ タイプ: アプリケーション/オクテット ストリーム

    [B@11f3043

--A300x--

サーバーからの応答。

<html>
  <head>
    <script type="text/javascript">
      window.location = "http://localtesting.com/mywebapp-1.0-SNAPSHOT#state=000000004C0FA618&result=%7b%22id%22%3a%22file.918bb0fbaf82f760.918BB0FBAF82F760!139%22%2c%22name%22%3a%22menu-icon.png%22%2c%22source%22%3a%22https%3a%2f%2f1m61va.tuk.livefilestore.com%2fy2mhncDTiOhUVFZxp08gi3yAFhp7OQ2-UYuQhnC_Obpoo4q5tG6onLuJz2mLJkJh6lUW5l8Cq2KBxvrLRrZ0bk6V7xmfso47cJWAw1fKE8bFJw%2fmenu-icon.png%3fdownload%26psid%3d1%22%7d";
    </script>
  </head>
</html>

画像をバイト[]に変換するコード

byte[] image=FileUtils.readFileToByteArray(physicalfile);

どんな手掛かり?

編集:以下は私が使用するコードスニペットです

プロパティファイルからいくつかの部分を取得しています。

env.properties
part1=--A300x\u000d\u000aContent-Disposition: form-data; name=\"file\"; filename=\"
part2=\"\u000d\u000aContent-Type: application/octet-stream\u000d\u000a\u000d\u000a        
part3=\u000d\u000a--A300x--

java file

String part1=bundle.getString("part1");
String part2= fileName+bundle.getString("part2");
String part3=bundle.getString("part3");

byte[] imageByteArray=FileUtils.readFileToByteArray(physicalfile);

PostMethod postMethod= new PostMethod("https://apis.live.net/v5.0/"+folderPath+"/files?state="+getSkydriveClientId()+"&redirect_uri="+baseURL+"&access_token="+getAcessToken());
postMethod.setRequestHeader("Content-Type","multipart/form-data; boundary=A300x");
postMethod.setRequestBody(part1+part2+imageByteArray+part3);

HttpClient httpClient=new HttpClient();
httpClient.executeMethod(postMethod);
4

2 に答える 2

0

バイト配列を呼び出しtoString()ているようです-それが[B@11f3043. リクエストを行うために使用しているコードを私たちに示していませんが、基本的に の呼び出しを避ける必要がありますtoString()API がを受け入れるかどうかはわかりませんが、byte[]コンテンツに適しているので、少なくともそれを取るメソッドを見つけるようにしてください。

InputStream編集: サンプル コードを見ると、 to を渡すことができるLiveConnectClient.uploadAsyncようbyte[]ですByteArrayInputStream

于 2013-08-03T10:37:58.027 に答える
0

クライアント ID と baseURL のスペースを削除した後、次のコード スニペットで動作するようになりました。

  String BOUNDARY_STRING="A300x";
        String urlString="https://apis.live.net/v5.0/"+folderPath+"/files?state="+getSkydriveClientId()+"&redirect_uri="+baseURL+"&access_token="+getAcessToken();
        URL connectURL = new URL(urlString);        
        HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection(); 
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY_STRING);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.connect();
        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
        dos.writeBytes("--" + BOUNDARY_STRING + "\r\n"); 
        dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n");
        dos.writeBytes("Content-Type: application/octet-stream\r\n");
        dos.writeBytes("\r\n");
        File fileToUpload=Util.getFile(fileName);
        FileInputStream fileInputStream = new FileInputStream(fileToUpload);
        int fileSize = fileInputStream.available();
        int maxBufferSize = 8192;
        int bufferSize = Math.min(fileSize, maxBufferSize);
        byte[] buffer = new byte[bufferSize];
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0) {           
        dos.write(buffer, 0, bytesRead);  
        int bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, buffer.length);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }
        fileInputStream.close();         
        dos.writeBytes("\r\n");
        dos.writeBytes("--" + BOUNDARY_STRING + "--\r\n");
        dos.flush();
于 2013-09-28T13:14:46.810 に答える