Upload a file through an HTTP form, via MultipartEntityBuilder, with a progress bar

后端 未结 3 1498
被撕碎了的回忆
被撕碎了的回忆 2020-11-27 09:53

The short version - org.apache...MultipartEntity is deprecated, and its upgrade, MultipartEntityBuilder, appears under-represented

3条回答
  •  清歌不尽
    2020-11-27 10:51

    The winning code (in spectacular Java-Heresy(tm) style) is:

    public static String postFile(String fileName, String userName, String password, String macAddress) throws Exception {
    
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(SERVER + "uploadFile");
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();        
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    
        final File file = new File(fileName);
        FileBody fb = new FileBody(file);
    
        builder.addPart("file", fb);  
        builder.addTextBody("userName", userName);
        builder.addTextBody("password", password);
        builder.addTextBody("macAddress",  macAddress);
        final HttpEntity yourEntity = builder.build();
    
        class ProgressiveEntity implements HttpEntity {
            @Override
            public void consumeContent() throws IOException {
                yourEntity.consumeContent();                
            }
            @Override
            public InputStream getContent() throws IOException,
                    IllegalStateException {
                return yourEntity.getContent();
            }
            @Override
            public Header getContentEncoding() {             
                return yourEntity.getContentEncoding();
            }
            @Override
            public long getContentLength() {
                return yourEntity.getContentLength();
            }
            @Override
            public Header getContentType() {
                return yourEntity.getContentType();
            }
            @Override
            public boolean isChunked() {             
                return yourEntity.isChunked();
            }
            @Override
            public boolean isRepeatable() {
                return yourEntity.isRepeatable();
            }
            @Override
            public boolean isStreaming() {             
                return yourEntity.isStreaming();
            } // CONSIDER put a _real_ delegator into here!
    
            @Override
            public void writeTo(OutputStream outstream) throws IOException {
    
                class ProxyOutputStream extends FilterOutputStream {
                    /**
                     * @author Stephen Colebourne
                     */
    
                    public ProxyOutputStream(OutputStream proxy) {
                        super(proxy);    
                    }
                    public void write(int idx) throws IOException {
                        out.write(idx);
                    }
                    public void write(byte[] bts) throws IOException {
                        out.write(bts);
                    }
                    public void write(byte[] bts, int st, int end) throws IOException {
                        out.write(bts, st, end);
                    }
                    public void flush() throws IOException {
                        out.flush();
                    }
                    public void close() throws IOException {
                        out.close();
                    }
                } // CONSIDER import this class (and risk more Jar File Hell)
    
                class ProgressiveOutputStream extends ProxyOutputStream {
                    public ProgressiveOutputStream(OutputStream proxy) {
                        super(proxy);
                    }
                    public void write(byte[] bts, int st, int end) throws IOException {
    
                        // FIXME  Put your progress bar stuff here!
    
                        out.write(bts, st, end);
                    }
                }
    
                yourEntity.writeTo(new ProgressiveOutputStream(outstream));
            }
    
        };
        ProgressiveEntity myEntity = new ProgressiveEntity();
    
        post.setEntity(myEntity);
        HttpResponse response = client.execute(post);        
    
        return getContent(response);
    
    } 
    
    public static String getContent(HttpResponse response) throws IOException {
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String body = "";
        String content = "";
    
        while ((body = rd.readLine()) != null) 
        {
            content += body + "\n";
        }
        return content.trim();
    }
    
    #  NOTE ADDED LATER: as this blasterpiece gets copied into various code lineages, 
    #  The management reminds the peanut gallery that "Java-Heresy" crack was there
    #  for a reason, and (as commented) most of that stuff can be farmed out to off-
    #  the-shelf jar files and what-not. That's for the java lifers to tool up. This
    #  pristine hack shall remain obviousized for education, and for use in a pinch.
    
    #  What are the odds??
    

提交回复
热议问题