Откройте MultipartFile (хранилище BLOB-объектов) на вкладке _blank - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть веб-приложение SpringBoot 2.1.3 + Thymeleaf 3.У меня есть большая форма с некоторой информацией, а также загрузка файла.Загрузка файла работает хорошо, но когда я хочу перезагрузить в ту же форму (для детализации или изменения цели) информацию, хранящуюся в БД, все работает хорошо, за исключением части, связанной с файлами.

Код, дляЧасть загрузки файла, является следующим:

<div class="form-group row">
 <label for="allegato_durc" class="col-sm-5 col-form-label form-label">Allegato DURC</label>
    <div class="col-sm-7">
      <input type="file" th:field="*{documentiFornitoreDto.allegato_DURC}" class="form-control-file form-control-sm datif_input" id="allegato_durc">
    </div>
 <label for="allegato_CCIAA" class="col-sm-5 col-form-label form-label">Allegato CCIAA</label>
    <div class="col-sm-7">
      <input type="file" th:field="*{documentiFornitoreDto.allegato_CCIAA}" class="form-control-file form-control-sm datif_input" id="allegato_CCIAA">
    </div>
</div>

Даже если файл присутствует, я вижу поле ввода пустым, как показано ниже:

enter image description here

Я сохраняю MultipartFile как MediumBlob в БД и, когда я перезагружаю информацию из БД, я перестраиваю MultipartFile следующим образом:

public class ByteToMultipartFile implements MultipartFile {

private byte[] fileContent;
private String fileName;


public ByteToMultipartFile(String fileName, byte[] fileContent) {
    this.fileContent = fileContent;
    this.fileName = fileName;
}

@Override
public String getName() {
    return fileName;
}

@Override
public String getOriginalFilename() {
    return fileName;
}

@Override
public String getContentType() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean isEmpty() {
    if (fileContent.length > 0) return false;
    else return true;
}

@Override
public long getSize() {
    return fileContent.length;
}

@Override
public byte[] getBytes() throws IOException {
    return fileContent;
}

@Override
public InputStream getInputStream() throws IOException {
    return new ByteArrayInputStream(fileContent);
}

@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
    // TODO Auto-generated method stub
}

}

Может быть, что-то не так с классом выше ??

В любом случае, я бы хотел выполнить 2 вещи:

1) Показать имя файла рядом с кнопкой «Выбрать» ( Файл Scegli на изображении), если присутствует

2) Показать кнопку, которая позволяет пользователю ОТКРЫТЬ файл в надлежащем приложении Windows (если это PDF-файл, открыть его с помощью Acrobat Reader и т. Д.)

Можно сделать некоторые ??


Я прочитал прямо здесь, в старый пост, thфайл может быть открыт в новой вкладке _blank (или страница не имеет значения) следующим образом:

<h4><a href="@document.ContentBlobURL" target="_blank">@document.Name</a></h4>

, это примерно то, что я хочу.Теперь автор пишет, что этот атрибут:

@document.ContentBlobURL

представляет адрес хранилища BLOB-объектов БД.Есть кто-то, кто знает, что это такое?Как я могу получить это значение?

Я много гуглял, но не смог найти ничего интересного.

Я хотел бы отметить, что, как вы знаете, в приложении SpringBoot (дляпример) с такой структурой:

enter image description here

если я сохраню файл на диске, например внутри статической папки, я могу открыть его с помощью:

http://localhost:8080/costruzione_stampi.pdf

Мне бы хотелось того же, но без сохранения файлов на диске ..

Надеюсь, кто-то ответит ..

1 Ответ

0 голосов
/ 12 апреля 2019

Я нашел решение, хочу опубликовать его, потому что надеюсь, что это поможет кому-то еще.

Погуглив, я обнаружил, что не могу установить значение

<input type="file" ...

вформа с данными (я пробовал с Multipart, File, Blob, byte [] ecc ...) загружен из DB по соображениям безопасности.

При этом я имею в виду, что я не могуустановить значение входного файла с помощью процедуры, подобной приведенной ниже:

@Controller
public class AppController {

  @GetMapping('/loadDataInForm')
  public String showData(Model model) {
     model.addAttribute('file', repository.getByPk(1)); // suppose that this repository retrive a Blob or MultipartFile or someone else
     return "form.html"
  }
}

form.html

.....
<input type="file" th:field="*{file}" id="file_data"> // always contains nothing

Я нашел какой-то обходной путь (один из них здесь ), нона самом деле это не лучшая практика.

В любом случае, если у вас есть другие потребности, например, для предварительного просмотра выбранного пользователем файла (но во время загрузки !!), вы можете использовать этот трюк:

<input type="file" th:field="*{someDto.file}" id="allegato_durc" onchange="show();">

.....

<script type="text/javascript">
    function show() {
        const fileElem = document.getElementById('allegato_durc').files[0];
        var binaryData = [];
        binaryData.push(fileElem);
        var blob = new Blob(binaryData, {type: "image/jpg"});
        const objectURL = window.URL.createObjectURL(blob);
        window.open(objectURL, '_blank');
    }
</script>

Надежда помогает ..

...