Мне нужно сохранить 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();
ваша переменная medicalPlan содержит длинную строку «JVBERi0xLjcKCjQgMCBvYmoKKElkZW50aXR5KQplbmRvYmoKNS ......», которую вы пытаетесь использовать в качестве имени файла. Вероятно, нужный файл имеет другое имя.
Спасибо, Алексей, я передаю фактический файл, а не адрес, вы можете помочь мне правильно его обработать?




Это то, чем я закончил.
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();
Я бы не рекомендовал хранить как Blob. Вы могли бы сохранить файл на жестком диске и сохранить путь к файлу как тип данных varchar (текст).