2016-07-11 1 views
-1

Я пытаюсь сохранить изображения как BLOB в моей базе данных ORACLE 11g R2 через базу64 загруженных файлов, но когда я извлекаю этот файл из БД, он не отображает изображение с base64_encode функция. И когда я загружаю этот файл из SQL Developer, файл также не является изображением, а только сообщение о том, что изображение недействительно или повреждено. Подробная информация о моей проблеме ниже: Я имею эту форму в моей веб-странице: Upload Page 1INSERT BASE64 ФАЙЛ В ORACLE BLOB ИСПОЛЬЗОВАНИЕ PHP

Кнопка «+» является входной файл, который при нажатии, пользователь может выбрать один или несколько файлов для загрузки и этих файлов показали на предварительном просмотре, как вы можете увидеть ниже: Upload Page 2

пользователь может открыть входной файл, selecet сколько изображений он хочет, близкий входной файл и повторно открыть его, чтобы добавить больше файлов, сколько раз он хочет. Для добавления каждого файла, Javascript создать предварительный просмотр и установить base64 в HREF «а» элемента, как показано ниже:

//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 
    } 
}); 

Когда пользователь нажимает на кнопку сохранить «Salvar», я беру все bases64 файлов добавленных и посланный AJAX для сохранения в поле BLOB в моей базе данных ORACLE 11g R2, как показано ниже:

//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; 
       } 
      } 
     }); 
} 

и взять эти файлы и сохранить на PHP, как показано ниже:

//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); 
} 

Может кто-нибудь дать мне некоторые помощь саам e этот файл base64 в поле BLOB на ORACLE и получить действительный файл из моего BLOB?

Thx много!

ответ

0

Я нашел решение моей самости просто регулируя свою функцию вставки, удаления 'Вставить:' строка из сгустка сохранить функцию, как показано ниже:

До:

// 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); 
} 

После:

// 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 снова! Надеюсь, это может быть полезно для кого-то в один прекрасный день! :)