2015-01-29 4 views
1

내 iOS 7 응용 프로그램에서 해당 속성을 사용하여 이미지를 내 서버에 업로드하려고합니다. 4 개의 값 x, y, w, h를 전달하고 싶습니다. 여기서 w와 h는 너비와 높이, x와 y는 0입니다. 다중 파일 업로드를 통해 이미지 업로드에 대한 정확한 형식을 사용했습니다. 하지만 내 서버에 "잘못된 입력"오류가 표시됩니다. 나는 같은 문제에 2 일을 보내고 많은 일을 시도했다. 그러나 그들은 일하지 않았다. 아래에 주어진 작업중인 안드로이드 코드를 따르고 있습니다. 또한 나는 7 코드를 첨부하고있다.이미지를 ios 7의 멀티 파트 파일로 서버에 업로드

누군가가 잘못되었거나 내 코드에서 누락 된 부분을 지적하십시오. 답장을 보내 주셔서 감사합니다.

안드로이드 코드 :

public class OWBImageUpload implements Runnable{ 

    URL connectURL; 
    String responseString; 
    String Title; 
    String Description; 
    byte[ ] dataToServer; 
    FileInputStream fileInputStream = null; 
    String urlString = "https://stage.oneworkbook.com/owb/attachments/photos"; 
    String token = ""; 

    public OWBImageUpload(String t, String vTitle, String vDesc){ 
      try{ 
       token = t; 
       connectURL = new URL(urlString); 
       Title= vTitle; 
       Description = vDesc; 
      }catch(Exception ex){ 
       Log.i("HttpFileUpload","URL Malformatted"); 
      } 
    } 

    public void uploadPhoto(FileInputStream fStream){ 
      fileInputStream = fStream; 
      upload(); 
    } 

    public void upload(){ 
      String iFileName = Title; 
      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 
      String Tag="fSnd"; 

      try 
      { 
        Log.e(Tag,"Starting Http File Sending to URL"); 

        // Open a HTTP connection to the URL 
        HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); 
        conn.setRequestProperty(OWBConstants.OWB_TOKEN_AUTH, token); 
        conn.setRequestProperty(OWBConstants.CLIENT_ID, OWBConstants.ANDROID_CLIENT_ID); 
        conn.setRequestProperty(OWBConstants.CLIENT_SECRET, OWBConstants.ANDROID_CLIENT_SECRET); 

        // Allow Inputs 
        conn.setDoInput(true); 

        // Allow Outputs 
        conn.setDoOutput(true); 

        // Don't use a cached copy. 
        conn.setUseCaches(false); 

        // Use a post method. 
        conn.setRequestMethod("POST"); 

        conn.setRequestProperty("Connection", "Keep-Alive"); 

        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 


        dos.writeBytes(twoHyphens + boundary + lineEnd); 
        dos.writeBytes("Content-Disposition: form-data; name=\"x\""+ lineEnd); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes("0"); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + lineEnd); 

        dos.writeBytes(twoHyphens + boundary + lineEnd); 
        dos.writeBytes("Content-Disposition: form-data; name=\"y\""+ lineEnd); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes("0"); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + lineEnd); 

        dos.writeBytes(twoHyphens + boundary + lineEnd); 
        dos.writeBytes("Content-Disposition: form-data; name=\"w\""+ lineEnd); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes("1400"); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + lineEnd); 

        dos.writeBytes(twoHyphens + boundary + lineEnd); 
        dos.writeBytes("Content-Disposition: form-data; name=\"h\""+ lineEnd); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes("1400"); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + lineEnd); 

        dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + iFileName +"\"" + lineEnd); 
        dos.writeBytes(lineEnd); 

        // create a buffer of maximum size 
        int bytesAvailable = fileInputStream.available(); 

        int maxBufferSize = 1024; 
        int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        byte[ ] buffer = new byte[bufferSize]; 

        // read file and write it into form... 
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

        while (bytesRead > 0) 
        { 
          dos.write(buffer, 0, bufferSize); 
          bytesAvailable = fileInputStream.available(); 
          bufferSize = Math.min(bytesAvailable,maxBufferSize); 
          bytesRead = fileInputStream.read(buffer, 0,bufferSize); 
        } 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

        // close streams 
        fileInputStream.close(); 

        dos.flush(); 

        Log.e(Tag,"File Sent, Response: "+String.valueOf(conn.getResponseCode())); 

        InputStream is = conn.getInputStream(); 

        // retrieve the response from server 
        int ch; 

        StringBuffer b =new StringBuffer(); 
        while((ch = is.read()) != -1){ b.append((char)ch); } 
        String s=b.toString(); 
        Log.i("Response",s); 
        dos.close(); 
      } 
      catch (MalformedURLException ex) 
      { 
        Log.e(Tag, "URL error: " + ex.getMessage(), ex); 
      } 

      catch (IOException ioe) 
      { 
        Log.e(Tag, "IO error: " + ioe.getMessage(), ioe); 
      } 
    } 

    @Override 
    public void run() { 
      // TODO Auto-generated method stub 
    } 

} 

내 IOS 7 코드 :

- (void)postUserImage:(NSString *)url postData:(NSMutableDictionary *)imageDetails token:(NSString *)token onSuccess:(HttpRequestSuccess)completion onFailure:(HttpRequestFailure)failure { 

    self.httpURL = url; 
    self.httpSuccess = completion; 
    self.httpFailure = failure; 

    NSString *filePath = [imageDetails valueForKey:@"filePath"]; 
    NSString *fileName = [imageDetails valueForKey:@"fileName"]; 
    NSData *imageData; 
    if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) { 
     NSLog(@"file path exists"); 
     imageData=[NSData dataWithContentsOfFile:filePath]; 
    } 


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    [request setHTTPMethod:@"POST"]; 

    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
    [request setHTTPShouldHandleCookies:NO]; 
    [request setTimeoutInterval:30]; 
    if(token != nil) { 
     [request setValue:token forHTTPHeaderField:@"x-owb-token"]; 
    } 

    [request setValue:IOS_CLIENT_ID forHTTPHeaderField:CLIENT_ID]; 
    [request setValue:IOS_CLIENT_SECRET forHTTPHeaderField:CLIENT_SECRET]; 
    //[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; 

    NSString *boundary = @"**********"; 

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 
    NSMutableData *body = [[NSMutableData alloc]init]; 

    // giving x,y,w,h 

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"x\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *[email protected]"0"; 
    [body appendData:[x dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"y\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *[email protected]"0"; 
    [body appendData:[y dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"w\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *[email protected]"500"; 
    [body appendData:[w dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"h\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *[email protected]"500"; 
    [body appendData:[h dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    // adding Image content 

    if (imageData) { 

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

     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n", fileName] dataUsingEncoding:NSUTF8StringEncoding]]; 

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

     [body appendData:imageData]; 

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

    [request setHTTPBody:body]; 


    //NSLog(@"http request body:%@",body); 

    //[request setAllHTTPHeaderFields:[request allHTTPHeaderFields]]; 

    //NSString *postLength = [NSString stringWithFormat:@"%d", [body length]]; 
    //[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if(connection == nil){ 
     NSLog(@"BAD CONNECTION"); 
    } 
} 
+0

참조 http://stackoverflow.com/a/24252378/1271826 – Rob

답변

0

관찰의 커플 :

  1. 하나의 문제는 요청 내에서 --(boundary)-- 문자열의 존재입니다 . 요청 끝에 만 나타나야합니다.

  2. 두 번째 문제는 모든 부분의 시작 부분에 끝 부분에이 경계 문자열을 쓰는 것으로 보입니다. 모든 부품이 시작될 때 한 번 나타납니다. 즉 두 필드 사이에 한 번만 나타납니다.

    결론은 --(boundary)는 요청의 모든 "일부"의 시작 부분에 표시해야하며 --(boundary)-- 문자열은 업로드 된 파일의 Content-Type을 주석 한

  3. 마지막에 나타납니다. 왜 그런 짓을했는지 확신 할 수 없지만 (JPG가 아닌 경우 해당 콘텐츠 유형을 적절한 콘텐츠 유형으로 바꿉니다)이 과정에서 부품의 헤더 뒤에서 데이터 앞에 나타나는 \r\n\r\n을 삭제했습니다. . Content-Type뿐만 아니라 \r\n도 누락되었습니다.

난 당신이 Charles 같은 도구를 사용하여이 요청을 관찰하고 잘 형성 요구 (예를 들어, 안드로이드 코드에서)와 비교하고 비교하는 것이 좋습니다 것입니다. 두 요청이 똑같은지 확인해야합니다. 빈 줄, 경계의 발생 및 -- 문자열은 매우 중요합니다.

정확히 말하자면,이 코드를 포기하여 자신 만의 멀티 파트 요청을 생성하고 AFNetworking과 같은 제대로 설정된 라이브러리를 사용하는 것이 좋습니다. 바퀴를 다시 발명 할 필요가 없습니다.

+0

팁 주셔서 감사합니다. 나는 그것을 시도했다. 하지만 이제 "내부 서버 오류"가 표시됩니다. –

+1

요청하신 것 같습니다. 나는 당신이 한 부분의 끝과 다음 부분의 시작 부분에서 모두 경계 문자열을 쓰고 있음을 알아 차렸다. (따라서 두 필드 사이에 두 번 등장한다.) 이 경계 문자열은 각 파트의 시작 부분에 한 번 나타나야합니다. 또한 파일을 업로드 할 때 'Content-Type'뿐만 아니라 필요한 '\ r \ n'도 주석 처리했습니다. – Rob

+0

고마워요. 그것을 찾기가 어려웠습니다. 또한 나의 반응에서 나는 빈 이미지를 얻고있다. 어떤 아이디어? –