Nano Hash - криптовалюты, майнинг, программирование

Откройте MultipartFile (хранилище BLOB-объектов) на вкладке _blank

У меня есть веб-приложение 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>

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

введите здесь описание изображения

Я сохраняю 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 и т. д.)

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


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

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

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

@document.ContentBlobURL

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

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

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

введите здесь описание изображения

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

http://localhost:8080/costruzione_stampi.pdf

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

Надеюсь кто-нибудь ответит..


Ответы:


1

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

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

<input type="file" ...

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

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

@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>

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

12.04.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..