#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 содержимого файла.