2016-05-27 10 views
1

Wir haben API, die Bilder in Base64 String konvertiert empfängt. Unsere mobile Anwendung verbraucht während des Konvertierungsprozesses zu viel RAM (nach base64), jetzt müssen wir das Image als Multipart hochladen. Ich habe den mobilen Teil entwickelt, aber ich stecke mit der PHP API fest. Wir haben von Volley zu Retrofit gewechselt, weil Volley keinen mehrteiligen Upload unterstützt.So erhalten Sie eine Multipart-Anfrage in PHP

Was muss ich im Skript ändern, das den Upload des mehrteiligen Bildes empfängt?

<?php 

//header('Content-Type : bitmap; charset=utf-8'); 
//header('Content-Type: application/json'); 

if (isset($_POST["encoded_string"])) { 

    //encoded_string -> base64 string sent from mobile phone 

    $encoded_string = $_POST["encoded_string"]; 
    $image_name  = $_POST["image_name"]; 

    $decoded_string = base64_decode($encoded_string); 

    $path = 'images/' . $image_name; 

    if (!file_exists('images')) { 
     mkdir('images', 0777, true); 
    } 

    $file = fopen($path, 'wb'); 

    $is_written = fwrite($file, $decoded_string); 
    fclose($file); 

    if ($is_written > 0) { 

     $connection = mysqli_connect('localhost', 'root', '', 'test'); 

     if ($connection) { 

      $query = "INSERT INTO photos(name,path) values('$image_name','$path');"; 

      $result = mysqli_query($connection, $query); 

      if ($result) { 
       echo json_encode(array(
        "response" => "Success! Image is succefully uploaded!.",  
        "result" => "success" 
       )); 
      } else { 
       echo json_encode(array(
        "response" => "Error! Image is not uploaded.", 
        "result" => "error" 
       )); 
      } 
      mysqli_close($connection); 
     } else { 
      echo json_encode(array(
       "response" => "Error! No database connection!", 
       "result" => "error" 
      )); 
     } 
    } 
} else { 
    echo json_encode(array(
     "response" => "Error! Please insert data!", 
     "result" => "error" 
    )); 
} 
?> 
+0

Ich habe benutzerdefinierte Methoden [http://stackoverflow.com/questions/36513174/android-multipart-image-upload-with-httpconnectionparams-deprecated-in-new-api/36513504#36513504) für Upload-Bilder es funktioniert vielleicht von Json dir helfen. –

+0

Bitte entfernen Sie den Datenbankcode aus Ihrem Skript. Es hat nichts mit dem Empfang eines Bildes zu tun. Konzentriere dich auf den Empfang. Halte das Skript klein. – greenapps

Antwort

0

Werfen Sie einen Blick auf move_uploaded_file() Funktion von PHP und der $_FILES Array.

Beispiel Code viel auf dieser Website.

0

Wenn Sie Multipart-Upload in Backend hinzufügen möchten, sollten Sie neben Änderungen vornehmen:

<?php 

//header('Content-Type : bitmap; charset=utf-8'); 
//header('Content-Type: application/json'); 


if (isset($_POST["encoded_string"])) { 


    //encoded_string -> base64 string sent from mobile phone 
    if (!file_exists('images')) { 
     mkdir('images', 0777, true); 
    } 

    $connection = mysqli_connect('localhost', 'root', '', 'test'); 

    if (!$connection) { 
     echo json_encode(array(
      "response" => "Error! No database connection!", 
      "result" => "error" 
     )); 
     die; 
    } 

    $responses = array(); 

    foreach ($_FILES["pictures"]["error"] as $key => $error) { 
     if ($error == UPLOAD_ERR_OK) { 
      $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; 
      $image_name = $_FILES["pictures"]["name"][$key]; 
      $path = 'images/' . $image_name; 
      if (move_uploaded_file($tmp_name, path)) { 
       $query = "INSERT INTO photos(name,path) values('$image_name','$path');"; 
       $result = mysqli_query($connection, $query); 
       if ($result) { 
        $responses[] = array(
         "response" => "Success! Image is succefully uploaded!.", 
         "result" => "success" 
        ); 
       } else { 
        $responses[] = array(
         "response" => "Error! Image is not uploaded.", 
         "result" => "error" 
        ); 
       } 
      } 
     } else { 
      $responses[] = array(
       "response" => "Error! Please insert data!", 
       "result" => "error" 
      ); 
     } 
    } 
    mysqli_close($connection); 
    echo json_encode(array(
     'responses' => $responses 
    )); 
} 

Auch machen Ufer verwenden Sie Post-Anforderung mit mehrteiliger Format (es sollte Header Content-Type haben: multipart/form-data und bi im richtigen Format - https://ru.wikipedia.org/wiki/Multipart/form-data). Hoffe es hilft dir.