根据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);
答案 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();