Search code examples
javaandroidpostfile-uploadupload

upload file using post method in android


i want to upload a file to a php server. i could upload file with below method :

curl -i -X POST -F file=@1.jpg http://something/sth

and after that i can download using browser.

but when uploading file using below java code i could not download using browser.

URL url = new URL(mUrl);
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        String Tag = "fSnd";
        Log.e(Tag, "Starting Http File Sending to URL");
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
                bytes);
        // Open a HTTP connection to the URL
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        // Allow Inputs
        conn.setDoInput(true);

        // Allow Outputs
        conn.setDoOutput(true);

        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type",
                "multipart/form-data;boundary=" + boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"title\""
                + lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes("File1");
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);

        dos.writeBytes("Content-Disposition: form-data; name=\"description\""
                + lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes("File2");
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);

        dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
                + "File3.jpg" + "\"" + lineEnd);
        dos.writeBytes(lineEnd);

        Log.e(Tag, "Headers are written");

        byte data[] = new byte[1024 * 2];
        int count = 0;
        while ((count = byteArrayInputStream.read(data)) != -1) {
            mSoFarLength += count;
            Log.d("FFF", "count : " + count + " mSoFarLength : "
                    + mSoFarLength + " mTotalLength : " + mTotalLength);
            dos.write(data, 0, count);
            mProgress = ((mSoFarLength * 100) / mTotalLength);
            for (LocalTransmitterListener baseTransmitterListener : baseTransmitterListeners) {
                baseTransmitterListener.onUpdateProgress(mProgress);
            }
        }

        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // close streams
        byteArrayInputStream.close();

        dos.flush();

        Log.e(Tag,
                "File Sent, Response: "
                        + String.valueOf(conn.getResponseCode()));

        InputStream is = conn.getInputStream();

        // retrieve the response from server
        int ch;

        StringBuffer b = new StringBuffer();
        while ((ch = is.read()) != -1) {
            b.append((char) ch);
        }
        String s = b.toString();
        Log.i("Response", s);
        dos.close();

Solution

  • at least i found solution.i should pay attention to entity name.and it should be same as the server.

                DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(mUrl);
            File file = new File(mFileAdrress);
            FileInputStream fileInputStream = new FileInputStream(file);
            httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
                    System.getProperty("http.agent"));
            InputStreamBody inputStreamBody = new InputStreamBody(
                    fileInputStream, file.getName());
    
            MultipartEntityBuilder multipartEntity = MultipartEntityBuilder
                    .create();
            multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            multipartEntity.addPart("file", inputStreamBody); // file should be same as server
            final HttpEntity myEntity = multipartEntity.build();
            class ProgressiveEntity implements HttpEntity {
                @Override
                public void consumeContent() throws IOException {
                    myEntity.consumeContent();
                }
    
                @Override
                public InputStream getContent() throws IOException,
                        IllegalStateException {
                    return myEntity.getContent();
                }
    
                @Override
                public Header getContentEncoding() {
                    return myEntity.getContentEncoding();
                }
    
                @Override
                public long getContentLength() {
                    return myEntity.getContentLength();
                }
    
                @Override
                public Header getContentType() {
                    return myEntity.getContentType();
                }
    
                @Override
                public boolean isChunked() {
                    return myEntity.isChunked();
                }
    
                @Override
                public boolean isRepeatable() {
                    return myEntity.isRepeatable();
                }
    
                @Override
                public boolean isStreaming() {
                    return myEntity.isStreaming();
                }
    
                @Override
                public void writeTo(OutputStream outstream) throws IOException {
    
                    class ProxyOutputStream extends FilterOutputStream {
    
                        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();
                        }
                    }
                    class ProgressiveOutputStream extends ProxyOutputStream {
                        public ProgressiveOutputStream(OutputStream proxy) {
                            super(proxy);
                        }
    
                        public void write(byte[] bts, int st, int end)
                                throws IOException {
                            writed += end;
                            out.write(bts, st, end);
                            mProgress = (int) ((mSoFarLength * 100) / (mTotalLength));
                        }
                    }
    
                    myEntity.writeTo(new ProgressiveOutputStream(outstream));
                }
    
            }
            ProgressiveEntity progressiveEntity = new ProgressiveEntity();
            httpPost.setEntity(progressiveEntity);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            String state = EntityUtils.toString(httpEntity);