2015-12-30 56 views
-1

我想轉換一些iOS代碼,我用它來上傳使用Retrofit 2.0 Android設備上的圖像。我在這方面的嘗試失敗了,我不知道爲什麼。服務器似乎沒有得到圖片。上傳圖片與改造2

這裏是工作的iOS代碼:

NSData *imageData = UIImageJPEGRepresentation(image, 90); 
// setting up the URL to post to 
NSString *urlString = [NSString stringWithFormat:@"http://%@/uploadPicture.php", [[NSUserDefaults standardUserDefaults] stringForKey:@"serviceIPAddress"]]; 

// setting up the request object now 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

/* 
add some header info now 
we always need a boundary when we post a file 
also we need to set the content type 

You might want to generate a random boundary.. this is just the same 
as my output from wireshark on a valid html post 
*/ 
NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

/* 
now lets create the body of the post 
*/ 
NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", persistentID] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:imageData]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
// setting the body of the post to the reqeust 
[request setHTTPBody:body]; 

// now lets make the connection to the web 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

這是失敗的Android代碼:

@POST 
Call<Void> uploadImage(@Url String url, @Body RequestBody imageFile); 

private void uploadInventoryImage(InventoryItem item, Uri imageUri, final boolean isNewItem) { 

    final File imageFile = new File(imageUri.getPath()); 
    final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); 
    final String imageName = item.getPersistentId() + ".jpg"; 
    final File renamedImageFile= new File(root, imageName); 

    if (imageFile.renameTo(renamedImageFile)) { 

     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 
     String uploadUrl = "http://" + settings.getString("serverPath", "") + "/mamobile/uploadPicture.php"; 

     RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"), renamedImageFile); 
     MultipartBuilder multipartBuilder = new MultipartBuilder("---------------------------14737809831466499882746641449"); 
     multipartBuilder.addFormDataPart("userfile", renamedImageFile.getName(), fileBody); 
     RequestBody fileRequestBody = multipartBuilder.build(); 

     mApiClient.getInventoryService().uploadImage(uploadUrl, fileRequestBody).enqueue(new Callback<Void>() { 
      @Override 
      public void onResponse(Response<Void> response, Retrofit retrofit) { 
       //upload image sucess 
       if (isNewItem) { 
        mBus.post(new InventoryEditEvent.OnUpdateSuccess()); 
       } else { 
        mBus.post(new InventoryEditEvent.OnNewSuccess()); 
       } 
      } 

      @Override 
      public void onFailure(Throwable error) { 
       if (error != null && error.getMessage() != null) { 
        mBus.post(new InventoryEditEvent.OnUploadImageFailure(error.getMessage(), -1)); 
       } else { 
        mBus.post(new InventoryEditEvent.OnUploadImageFailure("Unknown Error", -1)); 
       } 
      } 
     }); 


    } else { 
     //file name failed; 
     mBus.post(new InventoryEditEvent.OnUploadImageFailure("Could not rename image", -1)); 
    } 
} 

請求回來爲成功的,但服務器似乎並沒有獲得圖像。

回答

0

首先,嘗試改變服務方法描述本

@Multipart 
@POST 
Call<Void> uploadImage(@Url String url, @Part("description") String description, @Part("myfile\"; filename=\"image.png\"") RequestBody imageFile); 

description部分是可選的。只需要注意,您需要在@Part註釋中對文件名進行硬編碼。它對現有OkHttp缺陷的解決方法是默認內置的retrofit2 http客戶端。請參閱this

+0

我需要動態更改文件名。如果我不能這樣做,我可能需要重寫我的api的這部分:( – Hackmodford