2016-07-11 5 views
-1

Ich versuche, Bilder als BLOB auf meiner ORACLE 11g R2-Datenbank durch die Base64 von hochgeladenen Dateien zu speichern, aber wenn ich diese Datei aus der DB abrufen, zeigt es nicht ein Bild mit base64_encode Funktion. Und wenn ich diese Datei von SQL Developer herunterladen, wird das Image auch nicht in der Datei gespeichert, sondern nur in einer Nachricht, dass das Image ungültig oder beschädigt ist. Details meines Problems unten: ich diese Form in meiner Web-Seite haben: Upload Page 1INSERT BASE64 DATEI IN ORACLE BLOB MIT PHP

Die Taste „+“ ist, dass eine Datei-Eingabe, wenn darauf geklickt, kann der Benutzer eine oder mehrere Dateien auswählen zu laden und diese Dateien werden gezeigt, wie Sie unten auf einer Vorschau finden Sie unter: Upload Page 2

Der Benutzer Datei-Eingabe öffnen kann, selecet, wie viele Bilder er will, in der Nähe Input-Datei und öffnen Sie es erneut mehr Dateien hinzufügen, wie oft er will. Für jede Datei hinzugefügt, ein Javascript, um die Vorschau zu erstellen und die base64 in href von „a“ Element gesetzt, wie unten:

//create preview 
$("#exams-fileinput").on('change',function(e){ 
    var input = $(this); 
    var files = input.prop('files'); 
    var countFiles = files.length;//alert(files.length); 

    if (window.File && window.FileReader){ 
     var allow = /png|jpg|jpeg|tiff|pdf$/i; 
     // com suporte a FileReader() 
     for(i= 0;i <countFiles; i++){     
      file = files[i]; 
      if(!allow.test(file.name)){continue;} 
      imageType = /image.*/; 
      reader = new FileReader(); 
      reader.onload = function(e){ 
       filePreview = e.target; 
       var fileName = file.name; 
       var fileResult = filePreview.result; 
       var fileThumb = file.type.match(imageType) ? fileResult : 'assets/img/file-document.png'; // https://cdn4.iconfinder.com/data/icons/office-20/128/OFFice-51-256.png assets/img/file-document.png 
       var classIframe = file.type.match(imageType) ? '' : 'fancybox.iframe'; 
       var imgPrevContent = 
         '<div name="file-added" class="col-xs-6 col-sm-4 col-md-3 ms-file-thumbnail-preview-item" >'+ '<a href="'+fileResult+'" class="ms-filedata fancybox '+classIframe+'" rel="exam" data-type="img" data-file-name="'+fileName+'">'+ //<= aqui vai entrar o "fancybox.iframe", se necessário <= Vamos obter daqui o código do arquivo para subir ".ms-filedata" 
           '<figure class="img-responsive img-thumbnail" style="background-image:url('+fileThumb+');">'+ 

            '<figcaption>'+ 
             '<p><i class="fa fa-eye fa-3x"></i><p>'+ 
             '<p class="ms-ellipsis">'+fileName+'</p>'+ 
            '</figcaption>'+ 
           '</figure>'+ 
          '</a>'+ 
          '<input type="file" value="'+fileResult+'" id="" style="display: none;">'+ 
         '</div>'; 

console.log('Nome do arquivo: '+fileName+' - Tamanho: '+ file.size+' - HTML: '+imgPrevContent.length); 
       fileName=''; 
       $("#exam-view-files").append(imgPrevContent); 
      };     
      reader.readAsDataURL(file); 
     }    
    }else{ 
     // browser doesn't supor file reader 
    } 
}); 

Wenn Benutzer speichern Taste klicken Sie auf „Salvar“, nehme ich alle bases64 von Dateien hinzugefügt und von ajax gesendet, wie unten in einem BLOB-Feld in meine Oracle 11g R2 Datenbank zu speichern:

//save function 
$("#btn-save-files").click(function(e){ 
    var filesToAdd = []; 

    $("div[name=file-added]").each(function(e){ 
     filesToAdd.push({ 
          content: $(this).children("a").attr("href"), 
          name: $(this).children("a").data("file-name") 
         }); 
    }); 

    $.ajax({ 
      type: 'POST', 
      url: 'controller/ctrl-person-profile-action.php', 
      data: { action: "insertfiles", 
        files: filesToAdd 
        }, 
      datatype: "json", 
      async: true, 
      success: function(response){ 
       response = JSON.parse(response); 
       switch(response["status"].toLowerCase()){ 
        case "success": swal("Pronto", "Adicionado com sucesso", "success"); 
         break; 
        case "fail": swal("Atenção", response["message"], "warning"); 
         break; 
        default: swal("Ops..", "Ocorreu um erro inesperado ao inserir o medicamento", "error"); 
         break; 
       } 
      } 
     }); 
} 

und diese Dateien zu nehmen und von PHP, wie unten sparen:

//Ajax calls this function 
function InsertFiles(){ 
$files = isset($_REQUEST['files']) ? $_REQUEST['files'] : null; 

foreach ($files as $file) { 
    $fileBase64 = explode(",", explode(";", $file["content"])[1])[1]; 
    $fileType = explode(":",(explode(";", $file["content"])[0]))[1]; 

    $fileInsert = new MyFileClass(); 
    $fileInsert->setFile($fileBase64); 
    $fileInsert->setType($fileType); 
    $fileInsert->Insert(); 
} 

    //Class MyFile method insert: 
public function Insert(){ 
$sql = "INSERT FILES (ID, 
                  MIME_TYPE, 
                  FILE) 
                  VALUES(SEQ_FILES.NEXTVAL, 
                  '$this->type, 
                  EMPTY_BLOB() 
) RETURNING FILE INTO :file"; 

    $conn = GetDBConnection(); 
    $statment = oci_parse($conn, $sql) 

    // Creates an "empty" OCI-Lob object to bind to the locator 
    $fileBlob = oci_new_descriptor($conn, OCI_DTYPE_LOB); 

    // Bind the returned Oracle LOB locator to the PHP LOB object 
    oci_bind_by_name($statment, ":file", $fileBlob, -1, OCI_B_BLOB); 

    // Execute the statement using , OCI_DEFAULT - as a transaction 
    oci_execute($statment, OCI_DEFAULT) 
     or die ("Erro execute SQL command"); 

    // Now save a value to the LOB 
    if (!$fileBlob->save('INSERT: '.base64_decode($this->file))) { 
     // On error, rollback the transaction 
     oci_rollback($conn); 
     die("Erro execute SQL command"); 
    } else { 
     // On success, commit the transaction 
     oci_commit($conn); 
    } 

    // Free resources 
    oci_free_statement($statment); 
    $fileBlob->free(); 
    //feca conexão 
    oci_close($conn); 
} 

Kann mir jemand geben einige Hilfe zu sav e diese Base64-Datei in ein BLOB-Feld auf ORACLE und eine gültige Datei aus meinem BLOB abrufen?

Vielen Dank!

Antwort

0

fand ich Lösung von mir selbst nur meine Insert-Funktion eingestellt wird, Entfernen 'Einfügen:' string von Blobs speichern Funktion, wie unten:

Vorher:

// Now save a value to the LOB 
if (!$fileBlob->save('INSERT: '.base64_decode($this->file))) { 
    // On error, rollback the transaction 
    oci_rollback($conn); 
    die("Erro execute SQL command"); 
} else { 
    // On success, commit the transaction 
    oci_commit($conn); 
} 

Nach:

// Now save a value to the LOB 
if (!$fileBlob->save(base64_decode($this->file))) { 
    // On error, rollback the transaction 
    oci_rollback($conn); 
    die("Erro execute SQL command"); 
} else { 
    // On success, commit the transaction 
    oci_commit($conn); 
} 

Thx wieder! Ich hoffe, dass es für jemanden eines Tages nützlich sein kann! :)