0

根据 Skydrive api(http://msdn.microsoft.com/en-us/library/live/hh826531.aspx#uploading_files),我在 post 请求的正文中以字节 [] 形式传递图像的内容。文件创建发生在 skydrive 服务器上,但是当我在 skydrive 中打开它时,它显示“文件似乎已损坏或损坏”。

帖子请求的正文

--A300x 内容处置:表单数据;名称=“文件”;filename="menu-icon.png" 内容类型:application/octet-stream

    [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[] 的代码

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 是否接受a byte[],但您至少应该尝试找到一个接受 a 的方法,因为这适合您的内容。

编辑:查看示例代码,您似乎可以传入一个InputStreamto 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 回答