Может быть, кто-нибудь знает, как решить проблему с загрузкой файлов на сервер.
Отправка файла из Postman выглядит так
Но после загрузки из React у меня возникает такое исключение:
2020-11-09 18:17:38.829 DEBUG 10764 --- [nio-8081-exec-7] o.s.web.servlet.DispatcherServlet : POST "/api/ сотрудники/save-from-csv", параметры={маскированы} 09.11.2020 18:17:38.829 DEBUG 10764 --- [nio-8081-exec-7] s.w.s.m.a.RequestMappingHandlerMapping: сопоставлено с com.bank.controller.EmployeeController #uploadFile(MultipartFile, Model) 2020-11-09 18:17:38.831 DEBUG 10764 --- [nio-8081-exec-7].w.s.m.a.ServletInvocableHandlerMethod: не удалось разрешить параметр [0] в общедоступном org.springframework.http. ResponseEntity com.bank.controller.EmployeeController.uploadFile(org.springframework.web.multipart.MultipartFile,org.springframework.ui.Model) выдает исключение java.io.IOException: требуемая часть запроса 'файл 'нет 2020-11-09 18:17:38.831 DEBUG 10764 --- [nio-8081-exec-7].m.m.a.ExceptionHandlerExceptionResolver : Использование @ExceptionHandler com.bank.Exceptions.FileUploadExceptionAdvice#handleException(Exception, WebRequest) 2020 -11-09 18:17:38.832 DEBUG 10764 --- [nio-8081-exec-7] o.s.w.s.m.a.HttpEntityMethodProcessor: нет соответствия для [application/json, text/plain, /], поддерживается: [] 2020-11-09 18:17:38.833 WARN 10764 --- [nio-8081-exec-7].m.m.a.ExceptionHandlerExceptionResolver: решено [org.springframework.web.multipart.support.MissingServletRequestPartException: требуемая часть запроса «файл» отсутствует] 2020-11 -09 18:17:38.837 DEBUG 10764 --- [nio-8081-exec-7] o.s.web.servlet.DispatcherServlet: выполнено 400 BAD_REQUEST
Этот код для отправки файла из формы React:
class UploadFiles extends Component{
state = {
file : ''
};
componentDidMount = () => {
const {file} = this.props;
this.setState({ file })
};
uploadFile = ({target : {files}}) => {
console.log(files[0]);
let data = new FormData();
data.append('file', files);
axios.post("/api/employees/save-from-csv", data)
.then(res => {console.log(res)})
};
render(){
return(
Upload Your File
)
}}
Обслуживание
public void csvToEmployees(@RequestParam("file") MultipartFile file, Model model) {
// validate file
if (file.isEmpty()) {
model.addAttribute("message", "Please select a CSV file to upload.");
model.addAttribute("status", false);
} else {
try (Reader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
CsvToBean csvToBean = new CsvToBeanBuilder(reader)
.withType(Employee.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
List users = csvToBean.parse();
employeeRepository.saveAll(users);
model.addAttribute("users", users);
model.addAttribute("status", true);
} catch (Exception ex) {
model.addAttribute("message", "An error occurred while processing the CSV file.");
model.addAttribute("status", false);
}
}
}
Контроллер
@PostMapping("/employees/save-from-csv")
public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file, Model model) throws IOException {
ResponseEntity result = null;
boolean finished = false;
String message = "";
if (CSVHelper.hasCSVFormat(file)) {
try {
service.csvToEmployees(file, model);
message = "Uploaded the file successfully: " + file.getOriginalFilename();
result = ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
finished = true;
} catch (Exception e) {
message = "Could not upload the file: " + file.getOriginalFilename() + "!";
message += e;
result = ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(new ResponseMessage(message));
finished = true;
}
}
if (!CSVHelper.hasCSVFormat(file)){
message = "File is empty!";
result = ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ResponseMessage(message));
}
if (!finished) {
message = "Please upload a csv file!";
result = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseMessage(message));
}
return result;
}
CSVHelper
public class CSVHelper {
public static boolean hasCSVFormat(MultipartFile file) {
String TYPE = "text/csv";
return TYPE.equals(file.getContentType());
}
public static List csvToEmployees(InputStream is) {
try (BufferedReader fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
CSVParser csvParser = new CSVParser(fileReader,
CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());) {
List employees = new ArrayList();
Iterable csvRecords = csvParser.getRecords();
for (CSVRecord csvRecord : csvRecords) {
Employee employee = new Employee(
Long.parseLong(csvRecord.get("Id")),
csvRecord.get("Name"),
Long.parseLong(csvRecord.get("DepartmentId")),
Double.parseDouble(csvRecord.get("Salary")),
csvRecord.get("City"),
csvRecord.get("Street"),
csvRecord.get("BankName"),
csvRecord.get("CardNumber")
);
employees.add(employee);
}
return employees;
} catch (IOException e) {
throw new RuntimeException("fail to parse CSV file: " + e.getMessage());
}
}
}
UnitTest
@Test
public void saveEmployeesFromCSV() throws Exception {
String url = "/api/employees/save-from-csv";
String csvBuilder = "name,departmentId,salary,city,street,bankName,cardNumber\n" +
"Maxim,1,3855,Madrid,Street,Bank York,NY98675432100\n";
InputStream is = new ByteArrayInputStream(csvBuilder.getBytes());
MockMultipartFile mockFile = new MockMultipartFile("file", "employees.csv", "text/csv", is);
MockHttpServletResponse responseMessage = mvc.perform(MockMvcRequestBuilders.multipart(url)
.file(mockFile)
.param("file", "employees2.csv"))
.andReturn()
.getResponse();
assertEquals(responseMessage.getStatus(), 200);
}
Подробнее здесь: https://stackoverflow.com/questions/648 ... pring-boot
Загрузите CSV-файл из React и Spring Boot. ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1728637537
Anonymous
Может быть, кто-нибудь знает, как решить проблему с загрузкой файлов на сервер.
Отправка файла из Postman выглядит так
Но после загрузки из React у меня возникает такое исключение:
2020-11-09 18:17:38.829 DEBUG 10764 --- [nio-8081-exec-7] o.s.web.servlet.DispatcherServlet : POST "/api/ сотрудники/save-from-csv", параметры={маскированы} 09.11.2020 18:17:38.829 DEBUG 10764 --- [nio-8081-exec-7] s.w.s.m.a.RequestMappingHandlerMapping: сопоставлено с com.bank.controller.EmployeeController #uploadFile(MultipartFile, Model) 2020-11-09 18:17:38.831 DEBUG 10764 --- [nio-8081-exec-7].w.s.m.a.ServletInvocableHandlerMethod: не удалось разрешить параметр [0] в общедоступном org.springframework.http. ResponseEntity com.bank.controller.EmployeeController.uploadFile(org.springframework.web.multipart.MultipartFile,org.springframework.ui.Model) выдает исключение java.io.IOException: требуемая часть запроса 'файл 'нет 2020-11-09 18:17:38.831 DEBUG 10764 --- [nio-8081-exec-7].m.m.a.ExceptionHandlerExceptionResolver : Использование @ExceptionHandler com.bank.Exceptions.FileUploadExceptionAdvice#handleException(Exception, WebRequest) 2020 -11-09 18:17:38.832 DEBUG 10764 --- [nio-8081-exec-7] o.s.w.s.m.a.HttpEntityMethodProcessor: нет соответствия для [application/json, text/plain, /], поддерживается: [] 2020-11-09 18:17:38.833 WARN 10764 --- [nio-8081-exec-7].m.m.a.ExceptionHandlerExceptionResolver: решено [org.springframework.web.multipart.support.MissingServletRequestPartException: требуемая часть запроса «файл» отсутствует] 2020-11 -09 18:17:38.837 DEBUG 10764 --- [nio-8081-exec-7] o.s.web.servlet.DispatcherServlet: выполнено 400 BAD_REQUEST
[b]Этот код для отправки файла из формы React:[/b]
class UploadFiles extends Component{
state = {
file : ''
};
componentDidMount = () => {
const {file} = this.props;
this.setState({ file })
};
uploadFile = ({target : {files}}) => {
console.log(files[0]);
let data = new FormData();
data.append('file', files);
axios.post("/api/employees/save-from-csv", data)
.then(res => {console.log(res)})
};
render(){
return(
Upload Your File
)
}}
[b]Обслуживание[/b]
public void csvToEmployees(@RequestParam("file") MultipartFile file, Model model) {
// validate file
if (file.isEmpty()) {
model.addAttribute("message", "Please select a CSV file to upload.");
model.addAttribute("status", false);
} else {
try (Reader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
CsvToBean csvToBean = new CsvToBeanBuilder(reader)
.withType(Employee.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
List users = csvToBean.parse();
employeeRepository.saveAll(users);
model.addAttribute("users", users);
model.addAttribute("status", true);
} catch (Exception ex) {
model.addAttribute("message", "An error occurred while processing the CSV file.");
model.addAttribute("status", false);
}
}
}
[b]Контроллер[/b]
@PostMapping("/employees/save-from-csv")
public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file, Model model) throws IOException {
ResponseEntity result = null;
boolean finished = false;
String message = "";
if (CSVHelper.hasCSVFormat(file)) {
try {
service.csvToEmployees(file, model);
message = "Uploaded the file successfully: " + file.getOriginalFilename();
result = ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
finished = true;
} catch (Exception e) {
message = "Could not upload the file: " + file.getOriginalFilename() + "!";
message += e;
result = ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(new ResponseMessage(message));
finished = true;
}
}
if (!CSVHelper.hasCSVFormat(file)){
message = "File is empty!";
result = ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ResponseMessage(message));
}
if (!finished) {
message = "Please upload a csv file!";
result = ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseMessage(message));
}
return result;
}
[b]CSVHelper[/b]
public class CSVHelper {
public static boolean hasCSVFormat(MultipartFile file) {
String TYPE = "text/csv";
return TYPE.equals(file.getContentType());
}
public static List csvToEmployees(InputStream is) {
try (BufferedReader fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
CSVParser csvParser = new CSVParser(fileReader,
CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());) {
List employees = new ArrayList();
Iterable csvRecords = csvParser.getRecords();
for (CSVRecord csvRecord : csvRecords) {
Employee employee = new Employee(
Long.parseLong(csvRecord.get("Id")),
csvRecord.get("Name"),
Long.parseLong(csvRecord.get("DepartmentId")),
Double.parseDouble(csvRecord.get("Salary")),
csvRecord.get("City"),
csvRecord.get("Street"),
csvRecord.get("BankName"),
csvRecord.get("CardNumber")
);
employees.add(employee);
}
return employees;
} catch (IOException e) {
throw new RuntimeException("fail to parse CSV file: " + e.getMessage());
}
}
}
[b]UnitTest[/b]
@Test
public void saveEmployeesFromCSV() throws Exception {
String url = "/api/employees/save-from-csv";
String csvBuilder = "name,departmentId,salary,city,street,bankName,cardNumber\n" +
"Maxim,1,3855,Madrid,Street,Bank York,NY98675432100\n";
InputStream is = new ByteArrayInputStream(csvBuilder.getBytes());
MockMultipartFile mockFile = new MockMultipartFile("file", "employees.csv", "text/csv", is);
MockHttpServletResponse responseMessage = mvc.perform(MockMvcRequestBuilders.multipart(url)
.file(mockFile)
.param("file", "employees2.csv"))
.andReturn()
.getResponse();
assertEquals(responseMessage.getStatus(), 200);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/64889456/upload-csv-file-from-react-and-spring-boot[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия