Codename One中的多部分图像上传问题

时间:2017-06-20 01:05:23

标签: codenameone multipart image-upload

我正在使用此代码上传图片。它适用于模拟器,但在Android设备(OS 6.0)上始终失败

我的代码是

`private void uploadImage3(final String imagePath, String id){
        final Hashtable htArg = new Hashtable();
        htArg.put("pk1value", id);
        htArg.put("pk2value", "");
        htArg.put("pk3value", "");
        htArg.put("datatype", "6");
        htArg.put("module", "");
        htArg.put("action", "");
        try {
            htArg.put("thefile", FileSystemStorage.getInstance().openInputStream(imagePath));
        } catch (IOException ex) {
            Log.p("imgRequest.Error = " + ex.toString());
        }
        htArg.put("submit", "Submit");


        final String boundary = "-----------------------------0123456789012";

        MultipartRequest request = new MultipartRequest(){
            @Override
            protected void buildRequestBody(OutputStream os) throws IOException {
                Writer writer = null;
                writer = new OutputStreamWriter(os, "UTF-8"); 
                String CRLF = "\r\n";
                boolean canFlushStream = true;

                Enumeration e = htArg.keys();

                while(e.hasMoreElements()) {
                    if (shouldStop()) {
                            break;
                    }
                    String key = (String)e.nextElement();
                    Object value = htArg.get(key);

                    writer.write("--");
                    writer.write(boundary);
                    writer.write(CRLF);

                    if(value instanceof String) {
                        writer.write("Content-Disposition: form-data; name=\""+key+"\"");
                        writer.write(CRLF);
                        writer.write(CRLF);
                        writer.write(CRLF);
                        if(canFlushStream){
                            writer.flush();
                        }                
                        writer.write(Util.encodeBody((String)value));

                        if(canFlushStream){
                            writer.flush();
                        }
                    }else {
                        writer.write("Content-Disposition: form-data; name=\"" + key + "\"; filename=\"" + key +"\"");
                        writer.write(CRLF);
                        writer.write("Content-Type: ");
                        writer.write("image/jpeg");
                        writer.write(CRLF);
                        writer.write("Content-Transfer-Encoding: binary");
                        writer.write(CRLF);
                        writer.write(CRLF);
                        if(canFlushStream){
                            writer.flush();
                        }
                        InputStream i;
                        if (value instanceof InputStream) {
                            i = (InputStream)value;
                            byte[] buffer = new byte[8192];
                            int s = i.read(buffer);
                            while(s > -1) {
                                    os.write(buffer, 0, s);
                                    if(canFlushStream){
                                        writer.flush();
                                    }
                                    s = i.read(buffer);
                            }
                            // (when passed by stream, leave for caller to clean up).
                            if (!(value instanceof InputStream)) {
                                    Util.cleanup(i);
                            }
                        } else {
                                os.write((byte[])value);
                        }
                        value = null;
                        if(canFlushStream){
                            writer.flush();
                        }
                    }
                    writer.write(CRLF);
                    if(canFlushStream){
                        writer.flush();
                    }
                }
                writer.write("--" + boundary + "--");
                writer.write(CRLF);
                if(canFlushStream){
                    writer.flush();
                }
                writer.close();
            }

            @Override
            protected void readResponse(InputStream input) {
                try {
                    Result result = Result.fromContent(input, Result.XML);

                    Log.p("imgRequest response: " + result.toString());
                } catch (Exception ex) {
                    Log.p("imgRequest.Error = " + ex.toString());
                    ex.printStackTrace();
                }
            }

            @Override
            protected void handleErrorResponseCode(int code, String message) {
                Log.p("handleErrorResponseCode = "+code + ":" +  message);
            }

            @Override
            protected void handleException(Exception err) {
                Log.p("handleException = "+err.toString());
                err.printStackTrace();
            }
        };


        String theURL = Application.getCurrentConnection().get("URL").toString() + "/W1Servlet";
        request.setUrl(theURL+"/uploadfiledebug");
        request.setBoundary(boundary);
        request.setPost(true);

        try {
            //need to keep this code as it will calculate file size internally
            // and also have to add thefile separately in myArgHashTable
            request.addData("thefile", imagePath, "image/jpeg");
            request.setFilename("thefile", "img.jpeg");

        } catch (Exception ex) {
        }

        InfiniteProgress prog = new InfiniteProgress();
        Dialog dlg = prog.showInifiniteBlocking();
        request.setDisposeOnCompletion(dlg);
        NetworkManager.getInstance().addToQueueAndWait(request);
    }`

真实设备上的跟踪错误是

`java.net.ProtocolException: exceeded content-length limit of 11076 bytes
at com.android.okhttp.internal.http.RetryableSink.write(RetryableSink.java:58)
at com.android.okhttp.okio.RealBufferedSink.close(RealBufferedSink.java:234)
at com.android.okhttp.okio.RealBufferedSink$1.close(RealBufferedSink.java:209)
at com.codename1.impl.CodenameOneImplementation.cleanup(CodenameOneImplementation.java:4385)
at com.codename1.impl.android.AndroidImplementation.cleanup(AndroidImplementation.java:4579)
at com.codename1.io.Util.cleanup(Util.java:149)
at com.codename1.io.BufferedOutputStream.close(BufferedOutputStream.java:287)
at com.codename1.impl.CodenameOneImplementation.cleanup(CodenameOneImplementation.java:4385)
at com.codename1.impl.android.AndroidImplementation.cleanup(AndroidImplementation.java:4579)
at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:804)
at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:282)
at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60)
at java.lang.Thread.run(Thread.java:818)`

我不确定我错过了什么。

请有人帮助我。

由于

更新代码

`private void uploadImage4(final String imagePath, String id){
        MultipartRequest request = new MultipartRequest(){
            @Override
            protected void readResponse(InputStream input) throws IOException {
                try {
                    Result result = Result.fromContent(input, Result.XML);
                    if(isDebugOn){
                        Application.writeInDebugFile(debugFileName,
                          "result.toString(): "+ result.toString());
                    }
                    Log.p("imgRequest response: " + result.toString());
                } catch (Exception ex) {
                    Log.p("imgRequest.Error = " + ex.toString());
                    ex.printStackTrace();
                    if(isDebugOn){
                        Application.writeInDebugFile(debugFileName,
                          "readResponse.Exception: "+ex.toString());
                    }
                }
            }
        };
        String theURL = Application.getCurrentConnection().get("URL").toString() + "/W1Servlet";
        request.setUrl(theURL+"/uploadfiledebug");

        request.addArgument("entityname", "RCV_HEADERS");
        request.addArgument("category", "37");
        request.addArgument("description", "Uploaded by More4Apps Mobile App");
        request.addArgument("pk1value", id);//this is used as a primary key
        request.addArgument("pk2value", "");
        request.addArgument("pk3value", "");
        request.addArgument("datatype", "6");
        request.addArgument("module", "");
        request.addArgument("action", "");

        request.addArgument("submit", "Submit");

        try {
            //add the data image
            request.addData("thefile", imagePath, "image/jpeg");
            request.setFilename("thefile", "img.jpeg");
        } catch (IOException ex) {
            Log.p("Error:"+ ex.toString());
        }

        request.setPriority(ConnectionRequest.PRIORITY_CRITICAL);
        NetworkManager.getInstance().addToQueue(request);
    }`

新错误是:

`<ERROR_MESSAGE>IO Error:com.more4apps.mobile.ActionUploadFileoracle.ord.im.OrdHttpUploadException: IMW-00106: the end-of-headers delimiter (CR-LF) was not present
IMW-00112: additional error information: Content-Type: text/plain; charset=UTF-8IMW-00106: the end-of-headers delimiter (CR-LF) was not present
IMW-00112: additional error information: Content-Type: text/plain; charset=UTF-8
oracle.ord.im.OrdMultipartParser.doParse(OrdMultipartParser.java:312)
oracle.ord.im.OrdMultipartParser.parseFormData(OrdMultipartParser.java:150)
oracle.ord.im.OrdHttpUploadFormData.parseFormData(OrdHttpUploadFormData.java:532)
com.more4apps.mobile.ActionUploadFile.performAction(ActionUploadFile.java:39)
com.more4apps.mobile.W1Servlet.processAction(W1Servlet.java:449)
com.more4apps.mobile.W1Servlet.doPost(W1Servlet.java:248)
javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:64)
oracle.apps.jtf.base.session.ReleaseResFilter.doFilter(ReleaseResFilter.java:26)
com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:15)
oracle.apps.fnd.security.AppsServletFilter.doFilter(AppsServletFilter.java:318)
com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:642)
com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:391)
com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:908)
com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:458)
com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:313)
com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:199)
oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
java.lang.Thread.run(Thread.java:682)</ERROR_MESSAGE>`

1 个答案:

答案 0 :(得分:1)

如果您在多部分请求中覆盖buildRequestBody,则会有效地禁用其功能......

所有代码都不正确,不应该存在。默认情况下,Multipart将适用于大型文件。