当使用 okhttp 发送 post 请求时,服务器接收到的请求体为空。可能是什么问题?

Server receives the request body as null, when sending post request using okhttp. what could be the issue?

这是将参数 fname selectedFile(byteArray) 作为 post 请求正文的一部分从 android 发送到 tomcat 服务器的代码。

    public void uploadFile(){
        EditText filename=findViewById(R.id.fileName);
        //content://
        try {
            InputStream inputStream=getContentResolver().openInputStream(filePath);
            selectedFile= IOUtils.toByteArray(inputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String purl="http://192.168.1.11:8080/placement/V2TryUploadFile";

        RequestBody requestBody=new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("fname",filename.getText().toString())
                .addFormDataPart("selectedFile",filename.getText().toString(),RequestBody.create(MediaType.parse("application/pdf"),selectedFile))
                .build();
        Request request=new Request.Builder()
                .url(purl)
                .post(requestBody)
                .build();

        Toast.makeText(MainActivity.this,filename.getText().toString(),Toast.LENGTH_SHORT).show();
        Toast.makeText(MainActivity.this,selectedFile.length+":",Toast.LENGTH_SHORT).show();
        OkHttpClient okHttpClient=new OkHttpClient();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                call.cancel();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"Failed to Upload",Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String responseString=response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,responseString,Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

Servlet 代码(tomcat 服务器上的 运行)处理从 android add

发送的 post 请求
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String fname=request.getParameter("fname")+".pdf";
        Part selectedFile=request.getPart("selectedFile");
        System.out.println(fname);
        System.out.println(selectedFile+"");
        InputStream filecontent = selectedFile.getInputStream();

        byte[] fileAsByteArray = IOUtils.toByteArray(filecontent);

        FileOutputStream imageOutFile = new FileOutputStream("C:\Users\VAISHAK`\placeWorkSpace\placement\ResumeUploads\" + fname);
        imageOutFile.write(fileAsByteArray);
        imageOutFile.close();
        doGet(request, response);
    }

问题是 fname 和 selectedFile 在 android app 中未显示为空,但在 tomcat 服务器控制台中都显示为空。

下面还有tomcat服务器登录eclipse

null.pdf
null
Apr 13, 2020 11:56:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [trial.V2TryUploadFile] in context with path [/placement] threw exception
java.lang.NullPointerException
    at trial.V2TryUploadFile.doPost(V2TryUploadFile.java:49)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

我终于想出了解决办法

servlet 默认不处理

MutipartBody FORM

因此,为了使其支持该功能,我们需要将以下注释添加到 servlet

@MultipartConfig