很抱歉再次提出相同/相关的问题
今天早上我在Click here发了一个问题,我也得到了正确答案,我的问题也解决了。
在我的.net开发人员的同一案例中,创建了一个用于上传用户个人资料照片的API。我遵循相同的指导方针,我也做了代码
但是我收到了错误:
在这里,我发布了我的代码,如::
- (void)getLoginUserId:(NSString*)newUserId withUploadImageData: (NSString*)newImageData;
{
NSString*urlStr = @"http://taxi.expertverification.com/api/v1/Getimage";
NSString * myRequestString =[NSString stringWithFormat:@"user_id=%@&imageget=%@",
newUserId,
newImageData];
NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlStr]];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPMethod: @"POST"];
//post section
[request setHTTPBody: myRequestData];
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// handle response
NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"requestReply: %@", requestReply);
}] resume];
}
调用方法是::
[self getLoginUserId:@"121"
withUploadImageData:@"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"];
我的回复是:
requestReply: {"Message":"An error has occurred.","ExceptionMessage":"Parameter is not valid.","ExceptionType":"System.ArgumentException","StackTrace":"
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement)
at RKB.RestAPI.V1Controller.insertimages(getimage _get) in d:\\Projects\\RKB_RestAPI\\V1.cs:line 568
at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)"}
但如果我使用 ANDROID 运行此API,我会得到正确的回复
ANDROID代码是:
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
Log.d(TAG, "ba1: "+ba1);
nameValuePairs.add(new BasicNameValuePair("user_id", "121");
nameValuePairs.add(new BasicNameValuePair("imageget", "same as my image data");
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://taxi.expertverification.com/api/v1/Getimage";
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
String outPut = EntityUtils.toString(entity);
Log.i("GET RESPONSE—-", outPut);
Log.e("log_tag ******", "good connection";
bitmapOrg.recycle();
}catch (Exception e) {
Log.e("log_tag ******", "Error in http connection " + e.toString());
}
代码(用于ANDROID)与我上午发布的相同。
如果你不介意,请你帮我解决这个问题
答案 0 :(得分:1)
您遇到的问题是,您需要在汇总表单数据之前对base64数据进行URL编码(它填充+
s解码到空格,而不是+
s)
可能的选择:
CFURLCreateStringByAddingPercentEscapes
(确保在要转义的字符中包含+
)或stringByAddingPercentEncodingWithAllowedCharacters:
以转义数据(在汇总之前)这是我个人用于网址转义数据的类别:
<强>的NSString + urlencode.h 强>:
#import <Foundation/Foundation.h>
@interface NSString (urlencode)
- (NSString *)escapedValueForURLParameter;
@end
<强>的NSString + urlencode.m 强>:
#import "NSString+urlencode.h"
@implementation NSString (urlencode)
- (NSString *)escapedValueForURLParameter
{
return (__bridge_transfer NSString *)
CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef) self,
NULL,
(CFStringRef) @"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8
);
}
@end
答案 1 :(得分:-1)
我认为使用AFNetworking
很容易解决这个问题它将大大简化您的流程,为您节省大量时间。它是开发人员广泛使用的框架。
https://github.com/AFNetworking/AFNetworking
您可以使用几行(POST-multipart request)轻松发送带参数的图像:
例如检查此代码。(确保参考上面的链接并添加相应的头文件)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];