2016-01-18 3 views
-4

У меня есть приложение iOs, которое нужно реплицировать. Приложение использует функцию загрузки фотографий, используя следующий код:Android Загрузить фото

-(void)writePhotoToDirectory{ 
    // check 
    if([appDelegate.myGlobals hasInternet]){ 
     // show cover 
     [appDelegate.myGlobals showCover:@"Saving photo. Please wait..." thisView:self.view]; 

     // vars 
     NSMutableData *postData = [NSMutableData data]; 
     NSString *boundry = @"0xMyLbOuNdArY"; 
     UIImage *uploadImage = [toUploadPhotos objectAtIndex:0]; 

     // generate guid 
     CFUUIDRef theGUID = CFUUIDCreate(NULL); 
     CFStringRef string = CFUUIDCreateString(NULL, theGUID); 
     CFRelease(theGUID); 
     NSString *uploadImageGUID = [NSString stringWithFormat:@"%@", (__bridge NSString *)string]; 
     NSString *uploadImageName = [NSString stringWithFormat:@"%lu-%@", (unsigned long)messageId, uploadImageGUID]; 

     // set 
     CGSize imageSize = CGSizeMake((unsigned long)round(uploadImage.size.width), (unsigned long)round(uploadImage.size.height)); 
     NSData *imageData = UIImageJPEGRepresentation(uploadImage, 0.9); 
     //NSLog(@"this image %@", imageData); 

     // set directory varable 
     [postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundry] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"dirname\"; filename=\"%@\"\r\n\r\n", @""] dataUsingEncoding:NSUTF8StringEncoding]]; 

     // set image data 
     [postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundry] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploaded\"; filename=\"%@.jpg\"\r\n\r\n", uploadImageName] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [postData appendData:imageData]; 

     // end 
     [postData appendData: [[NSString stringWithFormat:@"\r\n--%@--\r\n", boundry] dataUsingEncoding:NSUTF8StringEncoding]]; 

     // url and request 
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/messagePhotoUploader.php", [appDelegate.myGlobals baseURL]]]; 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
     [request setHTTPMethod:@"POST"]; 
     [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)postData.length] forHTTPHeaderField:@"Content-Length"]; 
     [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundry] forHTTPHeaderField:@"Content-Type"]; 
     [request setHTTPBody:postData]; 

     NSLog(@"this post string %@?%@", url, [[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding]); 

     // show network activity 
     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 

     // send 
     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 
      // show network activity 
      [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

      // check 
      if(error) { 
       // handle error 
       [self webserviceDidNotSucceed:error]; 
      } 
      else{ 
       // handle success 
       //proceed 
      } 
     }]; 
    } 
    else{ 
     // alert 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Internet" message:@"Oops! You currently do not have an internet connection. Please try again later." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 

Моя проблема в том, что я не понимаю, как это работает, и мне нужно сделать такую ​​же функциональность для Android. Как я могу это сделать. Пожалуйста помоги.

EDIT:

Забыл добавить вещи, которые я пробовал:

private String multipartRequest(String urlTo, String filepath) { 
    HttpURLConnection connection = null; 
    DataOutputStream outputStream = null; 
    InputStream inputStream = null; 

    String twoHyphens = "--"; 
    String lineEnd = "\r\n"; 

    String result = ""; 

    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1 * 1024 * 1024; 


    try { 
     File file = new File(filepath); 
     FileInputStream fileInputStream = new FileInputStream(file); 

     URL url = new URL(urlTo); 
     connection = (HttpURLConnection) url.openConnection(); 

     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     connection.setUseCaches(false); 

     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Connection", "Keep-Alive"); 
     connection.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0"); 
     connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 



     outputStream = new DataOutputStream(connection.getOutputStream()); 
     outputStream.writeBytes(lineEnd+twoHyphens + boundary + lineEnd); 
     outputStream.writeBytes("Content-Disposition: form-data; name=\"dirname\"; filename=\"" + this.fileName + "\"" + lineEnd+lineEnd); 


     outputStream.writeBytes(lineEnd+twoHyphens+boundary+lineEnd); 
     outputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded\"; filename=\"" + this.fileName + ".jpg\"" + lineEnd+lineEnd); 
     outputStream.writeBytes(imageData); 

     outputStream.writeBytes(lineEnd+twoHyphens+boundary+twoHyphens+lineEnd); 

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

     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     while (bytesRead > 0) { 
      outputStream.write(buffer, 0, bufferSize); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     } 

     if (200 != connection.getResponseCode()) { 
      callBacks.didUploadFailed(connection.getResponseCode()+"",connection.getResponseMessage(),this); 
     } 

     inputStream = connection.getInputStream(); 

     result = this.convertStreamToString(inputStream); 
     Log.e(TAG,">>>>>"+result); 

     fileInputStream.close(); 
     inputStream.close(); 
     outputStream.flush(); 
     outputStream.close(); 

     return result; 
    } catch (Exception e) { 
     e.printStackTrace(); 

     callBacks.didUploadFailed("-1",e.getLocalizedMessage(),this); 
    } 

    return ""; 
} 
+1

так что вы хотите, чтобы мы конвертировали вышеуказанный код для вас? – k0sh

+0

объяснение того, как это работает. – MetaSnarf

+0

вы даже погуглили? – k0sh

ответ

0

Так после того, как много тонкой настройки и исследований я обнаружил, что путь я прошел изображение было неправильно. В коде, который у меня был вчера, я преобразовал растровое изображение изображения в строку base64 и затем преобразовал эту строку в массив байтов. Это было не так, как я должен преобразовать растровое изображение в байтах массива непосредственно:

 java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos); 

     byte[] b = baos.toByteArray(); 
     imageBytes = b; 

и передать его в мой выходной поток outputStream.writeBytes(imageData); часть и изменить его на outputStream.write(imageBytes);. Я надеюсь, что это поможет новичкам, как я, которые не могут получить помощь от «экспертов» SO.

Смежные вопросы