如何上传图片到服务器中的Andr​​oid? [英] how to Upload image into server in Android?

查看:157
本文介绍了如何上传图片到服务器中的Andr​​oid?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想利用手机摄像头上传图像捕获到服务器。服务器发送响应code = 200,但图像没有上传到服务器。

I am trying to Upload image Capture by Camera into server. server send response code = 200 but Image is not upload into server.

code是:

private boolean uploadData() {

    int count = this.forumThreadsB.size();
    for (int i = 0; i < count; i++)
    {
            if (isPhoto)
                message = "Uploading Shared Items " + (i + 1) + " of " + count;
            else
                message = "Uploading Shared Items " + (i + 1) + " of " + count;

            progressCount = (i * 1000)/count; 
            Hashtable<?, ?> threadD = (Hashtable<?, ?>)this.forumThreadsB.elementAt(i);

            String onlinePath = "http://xyx.com/;
            threadid = (String) threadD.get("devicethreadid");
            Hashtable<String, String> pairs = new Hashtable<String, String>();
            pairs.put("forumid",  threadD.get("lmsforumid").toString());
            pairs.put("topicid",  threadD.get("lmsthreadid").toString());
            pairs.put("clientid", LoginHelper.clientid);
            String fullfilepath = threadD.get("offlinepath").toString();
            int index = threadD.get("offlinepath").toString().lastIndexOf("/");

            String filename = fullfilepath.substring(index + 1);
            String filetype = "";

            if (filename.toLowerCase().contains(".png"))
                filetype = "image/png";
            else if (filename.toLowerCase().contains(".jpg"))
                filetype = "image/jpeg";
            else if (filename.toLowerCase().contains(".mp4"))
                filetype = "image/mp4";
            else if (filename.toLowerCase().contains(".3gp"))
                filetype = "image/3gpp";



            String boundaryMessage = getBoundaryMessage(BOUNDARY, pairs, fullfilepath, filename, filetype);
            String endBoundary = "\r\n--" + BOUNDARY + "--\r\n";

            HttpURLConnection conn = null;
            DataOutputStream dos = null;
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int maxBufferSize = 1*1024*1024;

            try
            {
                URL url = new URL(onlinePath);
                conn = (HttpURLConnection) url.openConnection();
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setUseCaches(false);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+BOUNDARY);
                dos = new DataOutputStream( conn.getOutputStream() );
                dos.write( boundaryMessage.getBytes());
                File file = new File(fullfilepath.substring(6));
                FileInputStream fileInputStream = new FileInputStream(file);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];
                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);
                }
                dos.write(endBoundary.getBytes());
                dos.flush();
                dos.close();
                fileInputStream.close();
                } catch (IOException ioe) {
                    Log.e("SyncUploadDownloadHelper", "Cannot upload file: " + ioe.getMessage(), ioe);
                    //return false;
                }

                // Read response
                try {
                    int responseCode = conn.getResponseCode();
                    if(responseCode == 200){

                         SQLiteForumDAO forumDAO = new SQLiteForumDAO(mcontext) ;
                            ForumThreadDTO forumThreadDTO = forumDAO.selectThread(this.threadid);
                            if(downloadPath!=null && downloadPath.equalsIgnoreCase("null") && downloadPath.equalsIgnoreCase(""))
                            forumThreadDTO.offlinefilepath = downloadPath;
                            forumDAO.updateThread(forumThreadDTO);


                    }


                } catch (IOException ioex) {
                    Log.e("SyncUploadDownloadHelper", "Upload file failed: " + ioex.getMessage(), ioex);
                    //return false;
                } catch (Exception e) {
                    Log.e("SyncUploadDownloadHelper", "Upload file failed: " + e.getMessage(), e);
                    //return false;
                }

                if (i == (this.forumThreadsB.size() - 1)){
                    this.sendStatus = "true";
                    progressCount = 1000;
                    SyncUploadDownloadHelper.this.notifyObservers("SyncUploadDownloadHelper:UploadDataFinish");
                }
                else
                    SyncUploadDownloadHelper.this.notifyObservers("SyncUploadDownloadHelper:UploadData");

                //return true;

    }

    return true;
}

功能:

private String getBoundaryMessage(String boundary, Hashtable<String, String> params, String fileField, String fileName, String fileType) {
      StringBuffer res = new StringBuffer("--").append(boundary).append("\r\n");
      Enumeration<String> keys = params.keys();
      while(keys.hasMoreElements()) {
       String key = (String)keys.nextElement();
       String value = (String)params.get(key);

       System.out.println(key + ": " + value);

       res.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n")    
       .append("\r\n").append(value).append("\r\n").append("--").append(boundary).append("\r\n");
      }
      res.append("Content-Disposition: form-data; name=\"").append("file").append("\"; filename=\"").append(fileName).append("\"\r\n") 
      .append("Content-Type: ").append(fileType).append("\r\n\r\n");

      return res.toString();
     }

在我的应用程序捕获图像,并将其保存到数据库。保存图像的路径是用它来上传图片文件。

in my Application I Capture Image and Save it to Database. path of save image is use to upload image file.

推荐答案

我用这样的:

public class HttpClient extends AsyncTask<Void, Integer, Long> {
    private static final int PROGRESS_DIALOG = 0;

    public ProgressDialog dialog;
    public File file;
    protected Long doInBackground(Void... params) {
        for (File file : files) {

            foto = "/sdcard/CameraExample/" + file.getName();
            DefaultHttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost(urll);



            MultipartEntity mpEntity = new MultipartEntity(
                    HttpMultipartMode.BROWSER_COMPATIBLE);

            mpEntity.addPart("form_file", new FileBody(file, "image/jpeg"));

            httppost.setEntity(mpEntity);

            HttpResponse response;
            try {

                response = httpclient.execute(httppost);

                HttpEntity resEntity = response.getEntity();

                if (resEntity != null) {

                }
                if (resEntity != null) {
                    resEntity.consumeContent();
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }



        }
        return null;
    }

    protected void onPostExecute(Long unused) {
        progressDialog.dismiss();

        ((Runnable) ctx ).run();

        super.onPostExecute(unused);
    }

    protected void onPreExecute() {
    progressDialog = new ProgressDialog(ctx);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setMessage("Загрузка фото...");
    progressDialog.setProgress(0);
    progressDialog.setMax(count);
    progressDialog.show();
    }

}

使用这个库code:

This code using that library:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.apache.james.mime4j.message.Message;

您可以在谷歌找到这一点。如果你没有找到 - 我可以给你这个库

You can find this in Google. If you don't find - i can send you this libraries.

这篇关于如何上传图片到服务器中的Andr​​oid?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆