如何使用将文件上载到服务器的方法发送其他字符串参数

时间:2014-08-27 10:47:13

标签: android multipartform-data

我发现这种方法可以将图像从设备上传到服务器。这一切都很好,但我还想发送一些额外的字符串参数与图像。作为一个菜鸟我发现很难将它们附加到这种方法上。我可以通过url发送字符串参数到目前为止我学到了很多,但我真的想将它们与图像一起发送

public int uploadFile(String sourceFileUri) {
        String upLoadServerUri = "http://www.mywebsite.com/web_services/ws_newitem.php";
        String fileName = "IMG_TEST.jpg";
    HttpURLConnection conn = null;
    DataOutputStream dos = null;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;
    File sourceFile = new File(sourceFileUri);

    if (!sourceFile.isFile()) {
        Log.e("uploadFile", "Source File Does not exist");
        return 0;
    }

    try { // open a URL connection to the Servlet
        FileInputStream fileInputStream = new FileInputStream(sourceFile);
        URL url = new URL(upLoadServerUri);
        conn = (HttpURLConnection) url.openConnection(); // Open a HTTP
                                                            // connection to
                                                            // the URL
        conn.setDoInput(true); // Allow Inputs
        conn.setDoOutput(true); // Allow Outputs
        conn.setUseCaches(false); // Don't use a Cached Copy
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("ENCTYPE", "multipart/form-data");
        conn.setRequestProperty("Content-Type",
                "multipart/form-data;boundary=" + boundary);
        conn.setRequestProperty("uploaded_file", fileName);


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

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

        bytesAvailable = fileInputStream.available(); // create a buffer of
                                                        // maximum size

        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        // read file and write it into form...
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        while (bytesRead > 0) {
            dos.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

        // send multipart form data necesssary after file data...
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // Responses from the server (code and message)
        serverResponseCode = conn.getResponseCode();
        String serverResponseMessage = conn.getResponseMessage();

        Log.i("uploadFile", "HTTP Response</span> is : "
                + serverResponseMessage + ": " + serverResponseCode);
        if (serverResponseCode == 200) {
            runOnUiThread(new Runnable() {
                public void run() {
                    tv.setText("File Upload Completed.");
                    Toast.makeText(UploadToServer.this,
                            "File Upload Complete.", Toast.LENGTH_SHORT)
                            .show();
                }
            });
        }

        // close the streams //
        fileInputStream.close();
        dos.flush();
        dos.close();

    } catch (MalformedURLException ex) {
        dialog.dismiss();
        ex.printStackTrace();
        Toast.makeText(UploadToServer.this, "MalformedURLException",
                Toast.LENGTH_SHORT).show();
        Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
    } catch (Exception e) {
        dialog.dismiss();
        e.printStackTrace();
        Toast.makeText(UploadToServer.this,
                "Exception : " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("Upload file to server Exception",
                "Exception : " + e.getMessage(), e);
    }
    dialog.dismiss();
    return serverResponseCode;
}

3 个答案:

答案 0 :(得分:2)

尝试此代码,如果您将所需的参数传递给此函数,它将100%工作。

在php上添加$ _post [&#34;用户名&#34;],$ _ post [&#34;密码&#34;]以接收参数

public JSONObject getJSONFromUrl(String url, String username,
            String password,  String photo_path) {
InputStream is = null;
    JSONObject jObj = null;
    static String jsonResp = "";
    String CONTENT_TYPE_JSON = "application/json";
    static String json = "";
    Context context;

        try {
            File file = null;
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            MultipartEntity entity = new MultipartEntity(
                    HttpMultipartMode.BROWSER_COMPATIBLE);

            if(photo_path != null)
                file = new File(photo_path);

            //add whatever the parameter you need to send along with image
            entity.addPart("username", new StringBody(username));
            entity.addPart("password", new StringBody(password));

            entity.addPart("file", new FileBody(file));
            entity.addPart("filetype",new StringBody("jpeg"));

            httpPost.setEntity(entity);



            HttpResponse httpResponse = httpClient.execute(httpPost);
            int code = httpResponse.getStatusLine().getStatusCode();

            if (code != 200) {
                Log.d("HTTP response code is:", Integer.toString(code));
                return null;
            } else {
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
        } catch (ConnectTimeoutException e) {



            return null;
        } catch (SocketTimeoutException e) {

            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        try {

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            jsonResp = sb.toString();



        } catch (Exception e) {

            return null;
        }


        try {
            jObj = new JSONObject(jsonResp);

        } catch (JSONException e) {

        }


        return jObj;
    }

答案 1 :(得分:0)

尝试以下

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("firstParam", paramValue1));
params.add(new BasicNameValuePair("secondParam", paramValue2));
params.add(new BasicNameValuePair("thirdParam", paramValue3));

OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(os, "UTF-8"));
writer.write(getQuery(params));
writer.flush();
writer.close();
os.close();

//...
conn.connect();

答案 2 :(得分:0)

使用loopj库。它支持上传文件和字符串数据。我在我的一个项目中使用过它。