0

안녕하세요! 다음과 비슷한 요청을하려고합니다.안드로이드에서 Objective-C로 다중 폼 데이터 (NSDictionary 및 Image) - C

public boolean ChangeAvatar(final Bitmap avatarBitmap, final IChangeAvatar handler) 
{ 
    String url = baseUrl + Language.getInstance().getLanguage() + "/my_url"; 
    final JSONObject params = new JSONObject(); 
    try { 
     JSONObject auth = new JSONObject(); 
     auth.put("uid",Long.toString(UserData.getInstance().getUserId())); 
     auth.put("token", UserData.getInstance().getUserToken()); 
     params.put("auth",auth); 
     params.put("act","avatar_change"); 
    } 
    catch (Exception e) 
    { 
     Log.e("network",e.getMessage()); 
     return false; 
    } 
    VolleyMultipartRequest myRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() { 
     @Override 
     public void onResponse(NetworkResponse response) { 
      try { 
       String responseStr = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
       handler.ChangeSuccess(""); 
       //JSONObject resp = new JSONObject(responseStr); 
       Log.d("network", responseStr); 
      } 
      catch (Exception e) 
      { 
       handler.ChangeFailed("error","Error"); 
       Log.d("network", e.getMessage()); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      if(error.getMessage()!= null) 
       handler.ChangeFailed("error",error.getMessage()); 
      else 
      { 
       try { 
        String responseStr = new String(error.networkResponse.data, HttpHeaderParser.parseCharset(error.networkResponse.headers)); 
        handler.ChangeFailed("error","errorMessage"); 
       } 
       catch (Exception e) 
       { 

        handler.ChangeFailed("error","errorMessage"); 
       } 

      } 

     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String,String> paramsMap = new HashMap<>(); 
      paramsMap.put("json",params.toString()); 
      return paramsMap; 
     } 

     @Override 
     protected Map<String, DataPart> getByteData() { 
      HashMap<String,DataPart> result = new HashMap<>(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      avatarBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
      final byte[] byteArrayImage = baos.toByteArray(); 
      result.put("userfile",new DataPart("avatar.jpg",byteArrayImage,"image/jpeg")); 
      return result; 
     } 
    }; 
    myRequest.setRetryPolicy(new DefaultRetryPolicy(5000,0,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
    RequestManager.getInstance(context).addToRequestQueue(myRequest); 
    return true; 
} 

하지만 항상 오류가 발생합니다. 내 문제는 내 이미지의 잘못된 키 전송이라고 생각됩니다. 가 여기에 현재 개발 있습니다

- (IBAction)saveAction:(UIButton *)sender 
{ 
    NSMutableDictionary *auth = [NSMutableDictionary dictionary]; 
    [auth setValue:[UserDefaultsHandler getUserDefaultsValueByKey:@"myId"] forKey:@"uid"]; 
    [auth setValue:[UserDefaultsHandler getUserDefaultsValueByKey:@"token"] forKey:@"token"]; 

    NSMutableDictionary *userDataDictionary = [NSMutableDictionary dictionary]; 
    [userDataDictionary setValue:auth forKey:@"auth"]; 
    [userDataDictionary setValue:@"avatar_change" forKey:@"act"]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 

    [request setURL:[NSURL URLWithString:@"myUrl"]]; 

    [request setHTTPMethod:@"POST"]; 

    NSMutableData *body = [NSMutableData data]; 

    NSString *boundary = @"---------------------------14737809831466499882746641449"; 

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 

    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    NSData* imageData = UIImageJPEGRepresentation(self.imageView.image, 1.0f); 

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[@"Content-Disposition: form-data; name=\"userfile\"; fileName=\"avatar.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 


    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:imageData]; 

    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

    // parameter all_data 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"all_data\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSString *jsonStr = [[NSString alloc]initWithData:[NSJSONSerialization dataWithJSONObject:userDataDictionary options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]; 

    [body appendData:[jsonStr dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

    // close form 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // setting the body of the post to the request 
    [request setHTTPBody:body]; 

    NSError *error=nil; 
    NSHTTPURLResponse *response=nil; 
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
} 

답변

0

확인이를, 어쩌면 도움 :

NSString *URLPath;//URL 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLPath] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    NSDictionary *questionDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; 
    NSError *error; 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:questionDict 
                 options:NSJSONWritingPrettyPrinted 
                 error:&error]; 

    NSString *jsonRequest = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    /* 
    .... 
    .... 
    */ 
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[requestData length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody: requestData]; 

    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    }]; 
    [task resume]; 

또는 (iOS 용 네트워킹 프레임 워크)

AFNetworking (그것은보다 더 쉽게)

관련 문제