2014-01-14 2 views
2

저는 Android 애플리케이션 을 만들고 파일을 저장하려고합니다. docx, 음악, 사진, 동영상 OpenStack 개체 저장소 (Swift) API를 사용하고 있습니다. 그러나 이러한 파일을 저장하는 데 문제가 있습니다. 내가 가진 API에서 파일의 이름 만 저장하지만 대시 보드에서 개체를 다운로드하려고하면 개체 자체가 누락됩니다.OpenStack에서 사진 및 기타 파일을 업로드하는 방법 Object Storage (Swift)

내가 얻은 API는 OpenStack 문서입니다.

방법 : PUT 링크 : (내 링크)/V1/AUTH_ (계정)/(용기)/(객체)

HEADER 컨텐츠 형 : (필수) X- 인증 토큰 : (필수) 콘텐츠 길이 : (선택 사항) 의 ETag : (선택 사항) 내용 - 처리 : (선택 사항) 콘텐츠 인코딩 : (옵션) X-삭제-에서을 (선택 사항) X- Object-Meta-PIN : X-삭제-후 : X-객체 메타

BODY 없음

내가 업로드하려고 첫 번째 파일은, 나는 또한 기본 때문에 이진 (64 기수)로 사진을 전송 시도한다 API에서는 문자열 만 허용합니다. 어디에 넣을 지 모르겠으므로 Content-Disposition으로 밀어 넣으려고했지만 실패했습니다. 오픈 스택이 받아 들일 수있는 제한된 데이터에 사진을 둘 수있는 곳이 어디인지 모르겠습니다.

도와주세요. 전화에서 업로드 한 파일을보고 대시 보드에서 다운로드하려고합니다.

이 내 코드입니다 : 코드에서

 HttpClient httpclient = new DefaultHttpClient(); 
     HttpPut httpost = new HttpPut("mylink/v1/AUTH_fa6362c6520449f9a8905e84fee68f8c/photos/"+imagename); 
     try { 
       httpost.setHeader("X-Auth-Token", "nasbfdblfdfsdfsdfd123a");    
       httpost.setHeader("Content-Type", "application/octet-stream");  
       httpost.setHeader("Content-Length ", Integer.toString(binaryimagelength)); 
       httpost.setHeader("Content-Disposition ", binaryimage);// this is path of the image from the phone memory (e.g.)  

      Log.i("", "pushing your data");  

      HttpResponse response=httpclient.execute(httpost); 
      ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
      String response2 = httpclient.execute(httpost, responseHandler); 
      Log.i("", "Response1: " + response.getStatusLine()); 
      Log.i("", "Response2: " + response2); 


     }catch (IOException e) {      
      Log.e("", "IOException " + e.toString()); 
      // TODO Auto-generated catch block 

      AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this,AlertDialog.THEME_DEVICE_DEFAULT_LIGHT).create(); 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage(e.toString()); 
      alertDialog.setButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        // TODO Add your code for the button here. 

       } 
      }); 
      alertDialog.show(); 
     } 

답변

0

, 당신은 파일 경로로 내용 - 처리를 지정했습니다.

파일 개체를 지정하십시오. 파일 경로에서 파일을 읽고 fileReadObject를 사용하여 content-disposition을 설정합니다.

참고 : 저는 파이썬 녀석입니다. 원하는 경우 파이썬 코드로 설명 할 수 있습니다.

+0

안녕하세요, 당신의 대답에 감사드립니다. 나는 당신이 제안한 것처럼 거기에 특정 물건을 넣으려고했다. 이것은 내 코드입니다 : 비트 맵 bm = BitmapFactory.decodeFile (이미지 경로); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress (Bitmap.CompressFormat.JPEG, 100, baos); byte [] b = baos.toByteArray(); httppost.setHeader ("Content-Type": b)를 넣었지만 문자열이 아닌 것은 허용하지 않습니다. 파일 경로에서 파일을 읽고 fileReadObject로 content-disposition을 설정하는 샘플 코드 형식이 있습니까? –

+0

ByteArray를 BufferedReader와 같은 String으로 변환 할 수 있습니까? –

+0

@SyedHabibM 내 질문을 볼 수 있니? 그 파이썬과 나는 비슷한 질문을했습니다. http://stackoverflow.com/questions/32786418/openstack-rest-api-send-a-file-with-python-to-a-openstack-container?noredirect=1#comment53414361_32786418 – D3GAN

0

요청 본문에 넣으십시오.

뭔가처럼 : 그것이 그래서 여기

httpost.setEntity(new FileEntity(new File(binaryimage)));

0

내가 질문을보고, 당신이 내 자신의 코드를 수행하는 나에게 영감을, 나는 그것이 작동 희망 당신

public int uploadToSwift(String filePath, String container) { 
    File file = new File(filePath); 
    String fileName = file.getName(); 
    long binaryLength = file.length(); 
    int statusCode; 

    // Start http communications 
    HttpClient httpclient = HttpClientBuilder.create().build(); 
    System.out.println("Communicating to: http://"+IP+"/v1/AUTH_e3fb300a1a1d48d49fb6512658eaebf5/"+container+"/"+fileName); 
    HttpPut httpost = new HttpPut("http://"+IP+":8080/v1/AUTH_e3fb300a1a1d48d49fb6512658eaebf5/"+container+"/"+fileName); 
    try { 
      httpost.setHeader("X-Auth-Token", openStackToken);    
      httpost.setHeader("Content-Type", "application/octet-stream");  
      httpost.setHeader("Content-Length ", Long.toString(binaryLength)); 
      httpost.setEntity(new FileEntity(file)); 
     System.out.println("Sending your data: " + fileName);  

     HttpResponse response = httpclient.execute(httpost); 
     statusCode = response.getStatusLine().getStatusCode(); 
     // A file was placed on the container 
     if(statusCode == 201){ 
      System.out.println(response.getStatusLine()); 
      Header[] headers = response.getAllHeaders(); 
      for(Header header : headers) 
       System.out.println(header.getName() + " " + header.getValue()); 
     } else { 
      System.out.println(response.getStatusLine()); 
     } 

    }catch (IOException e) {      
     System.out.println("IOException " + e.toString()); 
     return 500; 
    } 
    return statusCode; 
}