Как исправить ошибку 415 Ошибка неподдерживаемого типа носителя при загрузке файла Excel в Java? - PullRequest
0 голосов
/ 28 августа 2018

У меня проблема при загрузке файла Excel с помощью dropzone.js на мой сервер с помощью Java. При попытке загрузить файл появляется ошибка 415.

Вот мой код для обработки загруженного файла Excel,

@Path("/import/customers")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@POST
public Response importCustomersExcel(InMultiPart inMP) throws IOException, JSONException {

    System.out.println("PUT /import/customers");

    CustomerService customerService = Container.getCustomerService();
    FileProcessing processing = new FileProcessing();

    Response response = null;
    File retailersFile = null;

    boolean validationError = false;

    try {
        retailersFile = processing.toFile(inMP);
        customerService.validateImportExcel(retailersFile);
    } catch (ValidationException e) {
        validationError = true;
        String errorMessage = e.getMessage();
        if (e.getErrors() != null && !e.getErrors().isEmpty()) {
            ExcelRowErrorMessageBuilder messageBuilder = new ExcelRowErrorMessageBuilder(e.getErrors());
            errorMessage += messageBuilder.generateErrorMessage();
        }
        JSONObject json = new JSONObject();
        json.put("error", errorMessage);
        response = Response.status(Status.INTERNAL_SERVER_ERROR).entity(json).build();
        e.printStackTrace();
    } catch (Exception e) {
        validationError = true;
        JSONObject json = new JSONObject();
        json.put("error", e.getMessage());
        response = Response.status(Status.INTERNAL_SERVER_ERROR).entity(json).build();
        e.printStackTrace();
    } finally {
        //delete the file if error
        //else THE file is needed
        if (validationError) {
            boolean fileDeleted = FileProcessing.tryDelete(retailersFile);
            System.err.println("File " + (retailersFile == null ? "" :retailersFile.getName() + " was deleted : " + fileDeleted));
        }
    }

    if (!validationError) {

        boolean isImportRunning = false;
        synchronized (customerService) {
            isImportRunning = customerService.isRetailersImportRunning();

            if (!isImportRunning) {
                customerService.setImportRunning(true);
            }
        }

        if (!isImportRunning) {
            CustomerImportRunner customerImportRunner = new CustomerImportRunner(customerService, retailersFile);
            Thread thread = new Thread(customerImportRunner);
            thread.start();
            JSONObject json = new JSONObject();
            json.put("info", "Import started successfully!");
            response = Response.status(Status.OK).entity(json).build();
        } else {
            JSONObject json = new JSONObject();
            json.put("error", "Import is already running");
            response = Response.status(Status.INTERNAL_SERVER_ERROR).entity(json).build();
        }
    }

    return response;
}

и вот моя форма загрузки файла dropzone.js,

<form action="admin/rest/import/customers" class="dropzone" enctype="multipart/form-data"></form>

Я уже намеренно добавил multipart / form-data в свою форму, но когда я проверяю процесс при загрузке, тип контента Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryG1ZnT8kA25wpWLdW , Как исправить ошибку 415 при загрузке файла Excel, отображается ошибка 415. Что мне не хватает, чтобы положить на мой код Java? Пожалуйста помоги. Спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

Для Джерси вы должны сделать 2 вещи:

  1. добавить register(MultiPartFeature.class); к вашему ResourceConfig
  2. измените свой метод importCustomersExcel(InMultiPart inMP) на importCustomersExcel(@FormDataParam("file") InputStream stream, @FormDataParam("file") FormDataContentDisposition fileDetail)

Затем вы можете получить доступ к содержимому файла через stream и к деталям файла через fileDetail. Также убедитесь, что ваше Dropzone-paramName file.

...