在android中使用post方法上传文件

时间:2014-01-23 08:30:38

标签: java android post file-upload upload

我想将文件上传到php服务器。 我可以用以下方法上传文件:

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

然后我可以使用浏览器下载。

但是当使用以下java代码上传文件时,我无法使用浏览器下载。

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();

2 个答案:

答案 0 :(得分:1)

这是我的上传代码,它的工作原理。您需要导入httpmime jar
PHP代码

$uploads_dir = '/Library/WebServer/Documents/Upload/upload/'.$_FILES['userfile']['name'];
if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    echo $_POST["contentString"]."\n";
    echo  "File path = ".$uploads_dir;
    move_uploaded_file ($_FILES['userfile'] ['tmp_name'], $uploads_dir);
} else {
    echo "\n Upload Error";
    echo "filename '". $_FILES['userfile']['tmp_name'] . "'.";
    print_r($_FILES);

java代码

HttpClient client = new DefaultHttpClient();
HttpPost postMethod = new HttpPost("http://localhost/Upload/index.php");

File file = new File(filePath);

MultipartEntity entity = new MultipartEntity();
FileBody contentFile = new FileBody(file);
entity.addPart("userfile",contentFile);

StringBody contentString = new StringBody("This is contentString");
entity.addPart("contentString",contentString);

postMethod.setEntity(entity);
HttpResponse response = client.execute(postMethod);
HttpEntity httpEntity = response.getEntity();
String state = EntityUtils.toString(httpEntity);

答案 1 :(得分:0)

至少我发现solution.i应该注意实体名称。它应该与服务器相同。

            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);