2013-08-03 3 views
0

Согласно Skydrive api (http://msdn.microsoft.com/en-us/library/live/hh826531.aspx#uploading_files), я передаю содержимое изображения в байте [] в теле запроса на почту. создание файла происходит на сервере skydrive, но когда я его открываю в skydrive, он говорит: «Файл может быть поврежден или поврежден».Загрузка файлов в skydrive с помощью java

тело запроса на пост

--A300x Content-Disposition: форм-данных; Name = "файл"; имя файла = "меню-icon.png" Content-Type: применение/октет-поток

[[email protected] 

--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> 

код для преобразования изображения в байт []

байт [] изображение = FileUtils.readFileToByteArray (physicalfile);

Любой ключ?

EDIT: Ниже приводится фрагмент кода я использую

Я принимаю некоторые части из файла свойств.

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

Получил его работу со следующим фрагментом кода после обрезки пробелов в идентификаторе клиента и базеURL.

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(); 
0

Вы, кажется, вызывая toString() в массиве байт - это то, что преобразование его в [[email protected]. Вы не указали нам какой-либо код, который вы используете для выполнения запроса, но в основном вам нужно избегать вызова toString(). Я не знаю, принимает ли API a byte[], но вы должны хотя бы попытаться найти метод, который занимает один, как это было бы удобно для вашего контента.

EDIT: Глядя на пример кода, в этом случае вы можете передать в InputStream к LiveConnectClient.uploadAsync - так просто обернуть byte[] в ByteArrayInputStream.

Смежные вопросы