使用java将文件上载到skydrive

时间:2013-08-03 10:34:18

标签: java rest onedrive

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

发布请求的正文

- A300x 内容处理:表格数据; NAME = “文件”;文件名=“菜单的icon.png” Content-Type: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);

2 个答案:

答案 0 :(得分:0)

您似乎在字节数组上调用toString() - 这就是将其转换为[B@11f3043的原因。您没有向我们展示您用于提出请求的任何代码,但基本上您需要避免调用toString()。我不知道API 是否接受一个byte[],但您至少应该尝试找一个方法,这个方法适用于您的内容。

编辑:查看示例代码,您似乎可以将InputStream传递给LiveConnectClient.uploadAsync - 所以只需将byte[]包裹在ByteArrayInputStream中。

答案 1 :(得分: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();