Загрузка файла через $.ajax на java сервер

123
29 ноября 2019, 23:50

Есть такой код ajax вызова -

this.ajaxGetJsonAndReady = function(type, url, data, onSuccess, processData, contentType) {
    $.ajax({
        url: "/api/" + url,
        type: type,
        dataType: "json",
        data: data,
        processData: processData,
        contentType: contentType,
        success: function(json) {
            if (json.error) {
                error(json.error);
            } else {
                onSuccess(json.data);
                ready();
            }
        },
        error: function() {
            error();
        }
    });
}

В него передаю data отсюда -

var reader = new FileReader();
reader.readAsArrayBuffer($(this)[0].files[0]);
var array = new Uint8Array(reader.result);
//var binaryString = String.fromCharCode.apply(null, array);
var data = {};
data.test = array;
utils.ajaxGetJsonAndReady("GET", "fileUpload", data, function (processData) {
}, true, 'application/x-www-form-urlencoded');

Серверная часть: web.xml:

<servlet>
    <servlet-name>servlet</servlet-name>
    <servlet-class>web.framework.core.Servlet</servlet-class>
    <init-param>
        <param-name>configurationClass</param-name>
        <param-value>web.config.ServletConfigurationImpl</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>servlet</servlet-name>
    <url-pattern>/api/*</url-pattern>
    <url-pattern>/ui2/*</url-pattern>
</servlet-mapping> 

Servlet (сюда приходит все не так, как ожидается):

public class Servlet extends HttpServlet {
protected ServletConfiguration configuration;
@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    try {
        //noinspection unchecked
        val configClass = (Class<ServletConfiguration>) Class.forName(config.getInitParameter("configurationClass"));
        this.configuration = configClass.newInstance();
    } catch (Exception e) {
        throw new ServletException(e);
    }
}
@Override
protected void service(HttpServletRequest hrq, HttpServletResponse hre) {
    RequestMethod method;
    RequestHandler handler;
    try {
        method = RequestMethod.valueOf(hrq.getMethod());
        String uri = getRequestUri(hrq);
        val pathParams = new HashMap<String, String>();
        val params = hrq.getParameterMap();  // Вот здесь должны быть корректные параметры.
        handler = configuration.uriToHandlerMapper.createHandler(method, uri, pathParams, params);
        if (handler == null) {
            sendError(hrq, hre, HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        if (!handler.acceptMethods.contains(method)) {
            throw new Exception("Request method is not acceptable");
        }
        //noinspection unchecked
        handler.params = configuration.requestParamsParser.parse(pathParams, hrq.getParameterMap(), handler);
    } catch (Throwable e) {
        log.error("Request dispatcher or parameter parser failed, responding error 400", e);
        sendError(hrq, hre, HttpServletResponse.SC_BAD_REQUEST);
        return;
    }
    try {
        handler.requestMethod = method;
        handler.httpServletRequest = hrq;
        handler.httpServletResponse = hre;
        handler.execute();
        hre.flushBuffer();
    } catch (Throwable e) {
        log.error("Request handler failed, responding error 500", e);
        sendError(hrq, hre, HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
}
@SuppressWarnings("WeakerAccess")
protected String getRequestUri(HttpServletRequest hrq) {
    String uri = hrq.getServletPath();
    String pathInfo = hrq.getPathInfo();
    if (pathInfo != null) {
        uri += pathInfo;
    }
    return uri;
}
@SuppressWarnings("WeakerAccess")
protected void sendError(HttpServletRequest hrq, HttpServletResponse hre, int status) {
    try {
        val handler = configuration.uriToHandlerMapper.createErrorHandler(hrq, status);
        handler.httpServletRequest = hrq;
        handler.httpServletResponse = hre;
        handler.execute();
        hre.flushBuffer();
    } catch (Throwable e2) {
        // createErrorHandler() failed, I/O error, or response is already committed. Nothing we can do.
    }
}

Но на сервер приходит массив параметров, а не один параметр с именем test. Что я делаю не так? Поправки и уточнения приветствуются!

Так же ищу другие работающие способы передать файл на сервер.

READ ALSO
Как задать вопрос напрямую участнику Stack Overflow?

Как задать вопрос напрямую участнику Stack Overflow?

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

118
Не получается установить Webpack

Не получается установить Webpack

Пытаюсь установить webpack

125
Network Error при запросе на сервер через Axios

Network Error при запросе на сервер через Axios

код запроса на клиенте , тестирую на локалке (подключаюсь к localhost:4000) :

116