Храните PDF-файл в базе данных mySQL с помощью HTML jQuery и Java

Мне нужно сохранить PDF-файл (каждый PDF-файл будет иметь максимум <5 страниц) в базе данных mySQL. Столбец определен как mediumblob. Размер тестового pdf-файла 198 КБ. Я получаю сообщение об ошибке «Произошли ошибки в addMedicalPlan: java.io.FileNotFoundException:», за которым следует дамп файла «JVBERi0xLjcKCjQgMCBvYmoKKElkZW50aXR5KQplbmRvYmoKNS ......» и в конце слишком длинное имя файла или расширение «(имя файла или расширение).

Мне удалось сделать это с изображениями, и я пытался перенаправить этот код для хранения pdf; путем изучения статей и других вопросов о Stackoverflow. К сожалению, для меня большая часть примеров относится к PHP. Мне удалось прочитать PDF-файл и отобразить его на странице с помощью этого кода:

HTML:

<div class = "form-group">
    <embed width = "191" height = "207" id = "image" src = "" type = "application/pdf">
    <input class = "form-control-file col-lg-12 col-md-12 col-sm-12 col-xs-12 photo-input" type = "file" id = "photo" name = "photo" placeholder = "PDF">
</div>

jQuery:

$(document).on('change', '.photo-input', function(){
    //Check for a valid image extension
    var img1 = this.files[0].type;
    alert("img1: " + img1);
    var mySubString = img1.substring(
        img1.lastIndexOf("image") + 13
    );
    alert("mySubString: " + mySubString)
    if ($.inArray(mySubString, ['pdf']) == -1) {
        alert('Add invalid extension 1!');
        $('#image').attr('src', '');
    }else{
        //Check for a valid image size
        if (this.files[0].size < 10000000){
            readURL(this, this.id);
        }else{
            alert("This image is to large (must be < 1 MB).")
            $('#image').attr('src', '');
        }
        var img1 = document.getElementById('image');
        img2 = (img1.getAttribute('src')).replace(/^data:application/(pdf);base64,/, "");
    }
});

function readURL(input, id) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('#image').attr('src', e.target.result);
        }

        reader.readAsDataURL(input.files[0]);
    }
}

Затем я передаю PDF-файл для хранения с помощью ajax:

$.ajax({
        type: "POST",
        url: "MedicalPlanAddView",
        cache: false,
        data : {
         ssAccountLevel : sessionStorage.getItem('ssAccountLevel'),
         ssAccountID : sessionStorage.getItem('ssAccountID'),
         ssNameID : sessionStorage.getItem('ssNameID'),

         image : img2,
         mpNameAdd: $("#mpNameAdd").val(),
  }, 
})

И Java на стороне сервера:

private static byte[] getByteArrayFromFile(final String handledDocument) throws IOException {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final InputStream in = new FileInputStream(handledDocument);
    final byte[] buffer = new byte[500];
    int read = -1;
    while ((read = in.read(buffer)) > 0) {
        baos.write(buffer, 0, read);
    }
    in.close();
    return baos.toByteArray();
}

ps.setString(1, nameId);
ps.setString(2, medicalPlanName);
ByteArrayInputStream bais = new 
ByteArrayInputStream(getByteArrayFromFile(medicalPlan)); //pdf image
ps.setBlob(3, bais); 
ps.setString(4, updateDate);

ps.executeUpdate();

Я бы не рекомендовал хранить как Blob. Вы могли бы сохранить файл на жестком диске и сохранить путь к файлу как тип данных varchar (текст).

Madhur Bhaiya 18.11.2018 05:25

ваша переменная medicalPlan содержит длинную строку «JVBERi0xLjcKCjQgMCBvYmoKKElkZW50aXR5KQplbmRvYmoKNS ......», которую вы пытаетесь использовать в качестве имени файла. Вероятно, нужный файл имеет другое имя.

Alexei Kaigorodov 18.11.2018 06:26

Спасибо, Алексей, я передаю фактический файл, а не адрес, вы можете помочь мне правильно его обработать?

Glyn 19.11.2018 02:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
174
1

Ответы 1

Это то, чем я закончил.

HTML:

<div class = "form-group">
        <embed width = "191" height = "207" id = "image" src = "" type = "application/pdf" class = "img-thumbnail">
        <input class = "form-control-file col-lg-12 col-md-12 col-sm-12 col-xs-12 photo-input" type = "file" id = "photo" name = "photo" placeholder = "PDF">
</div>

jQuery:

$(document).on('change', '.photo-input', function(){
    //Check for a valid image extension
    var img1 = this.files[0].type;
    var mySubString = img1.substring(
        img1.lastIndexOf("image") + 13
    );
        if ($.inArray(mySubString, ['pdf']) == -1) {
        alert('invalid extension!');
        $('#image').attr('src', 'data:application/(pdf);base64');
    }else{
        //Check for a valid image size
        if (this.files[0].size < 10000000){
            readURL(this, this.id);
        }else{
            alert("This image is to large (must be < 1 MB).")
            $('#image').attr('src', 'data:application/(pdf);base64');
        }
        var img1 = document.getElementById('image');
        img2 = (img1.getAttribute('src')).replace(/^data:application/(pdf);base64,/, "");
    }
});

function readURL(input, id) {
    if (input.files && input.files[0]) {
        var reader = new FileReader();

        reader.onload = function (e) {
            $('#image').attr('src', e.target.result);
        }

        reader.readAsDataURL(input.files[0]);
    }
}

    submitHandler : function(showMPAddForm) {
        var img1 = document.getElementById('image');
        img2 = (img1.getAttribute('src')).replace(/^data:application/(pdf);base64,/, "");

        $.ajax({
            type: "POST",
            url: "MedicalPlanAddView",
            cache: false,
            data : {
                ssAccountLevel : sessionStorage.getItem('ssAccountLevel'),
                ssAccountID : sessionStorage.getItem('ssAccountID'),
                ssNameID : sessionStorage.getItem('ssNameID'),

                image : img2,
                mpNameAdd: $("#mpNameAdd").val(),
            }, 
        })
        .fail (function(jqXHR, textStatus, errorThrown) {
            //alert(jqXHR.responseText);
            $('#ajaxGetUserServletResponse13').text('Error adding Medical Plan.');
        })
        .done(function(responseJson){
            $('#ajaxGetUserServletResponse13').text('Medical Plan added.');
            showActionPlanDataTable();
        })
    }

SQL:

                ps = c.prepareStatement(updateWithPhoto);
                ps.setString(1, medicalPlanName);

                BASE64Decoder decoder = new BASE64Decoder();
                byte[] imageByte = decoder.decodeBuffer(medicalPlan);
                ps.setBlob(2, new SerialBlob(imageByte));

                ps.setString(3, updateDate);
                ps.setString(4, medicalPlanId);

                ps.executeUpdate();

Другие вопросы по теме