Преобразование содержимого в Base64 и отправка в метод Spring, ожидающий составного файла

#javascript #base64 #multipartfile

#javascript #base64 #многочастный файл

Вопрос:

Из-за проблем с сервером мне нужно преобразовать содержимое загружаемого файла в Base64, прежде чем он будет отправлен на сервер.

Я управлял JS-частью вещей, используя reader.readAsDataURL, чтобы получить содержимое в Base64 в локальной переменной JS. Затем я попытался создать новую FormData и установить там переменную base64 — она заменяет имя, но затем она также заменяет тип — это уже не a, а просто двоичные данные — поэтому, когда я отправляю это на сервер, я получаю ошибку Spring typeMismatch.org.springframework.web.multipart.MultipartFile

В принципе — есть мысли, как преобразовать содержимое файла в Base64 (сделано нормально), но отправить в существующий метод JAVA с помощью Spring MultipartFile?

т. Е. Без переписывания и добавления дополнительных полей в FormData для имени и размера файла и т. Д. (Материал, который я бы получил, используя многочастный файл на стороне сервера). JS: (удалена обработка ошибок)

 var input = $(".actualFileInput");
var files = null;
// File data
if (input[0].files.length > 0) {
    files = input[0].files;
}
var file = files[0], reader = new FileReader();
            
reader.onloadend = function () {
    var b64 = reader.result.replace(/^data:. ;base64,/, '');
    var name = input.attr('name');
    input.attr('name', '');
                
    var newFormData = new FormData(form);   // New form with all data from the existing one
    newFormData.set('uploadFile',b64);  // replace with the base64 value of the selected file
    var request = new XMLHttpRequest();
                
    request.onreadystatechange = function () {
        request.open(form.method, form.action, true);
        request.onload = function() {
            var url = window.location;
            input.attr('name', name);   
            request.send(newFormData);
                
    };
reader.readAsDataURL(file);
 

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

 @RequestMapping(method = RequestMethod.POST, params = "upload")
public String upload(@ModelAttribute("uploadDocument") UploadDocument document, BindingResult result,
        ModelMap model, HttpServletRequest request, SessionStatus status) throws Exception {
 

UploadDocument является:

общедоступный класс UploadDocument реализует Serializable {

 private static final long serialVersionUID = -3534003705995293025L;

// File upload work area
private MultipartFile   uploadFile = null;
private String          fileComment = null;
private Integer         fileTypeId = null;
... (other fields in the <form>)
 

Все JAVA-материалы работают нормально, если я просто отправляю форму. Но в JS чтение содержимого файла как Base64, а затем отправка в виде поля не переводится в MultipartFile . Изменить на byte[] и добавить новые поля для метаданных файла самостоятельно? Или есть какой-то трюк, который я упускаю.

Спасибо, ребята.

Ответ №1:

Способ заставить эту переменную JS отправлять в многочастный файл Spring:

newFormData.set(‘uploadFile’,новый большой двоичный объект ([b64]),files[0].name); // заменить значением base64 выбранного файла

т. е. сделайте его большим двоичным объектом, а 3-й аргумент — это имя файла, выбранное пользователем. Теперь это отправляет значение base64 содержимого файла.