2015-12-30 48 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