Android 文件的上传

转载自 http://www.cnblogs.com/fly_binbin/archive/2010/12/18/1910273.html

因为工作需要,暂时没有对GPS(2)完成,今天开始完成了,一个文件上传的内容的实现,Android要实现文件上传,可以利用Socket上 传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就 容易造成数据丢失,因此在这里选择了Web进行上传,使用Web进行上传是模拟的Http Post上传数据,当然,Post上传数据的类,在网上找了一找,方式虽然很多,但是没有一个感觉是我所使用的,所以参照原理之类的,进行了一下修改,算 是做了一个参考。并且利用这个类完成了文件和表彰的上传服务。

具体代码如下:

文件与表单上传类:

package com.UpLoadFileTest;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.Map;public class PostFile {      //上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件,这根据需要页定    public static String post(String actionUrl, Map<String, String> params,            Map<String, File> files) throws IOException {        String BOUNDARY = java.util.UUID.randomUUID().toString();        String PREFIX = "--", LINEND = "\r\n";        String MULTIPART_FROM_DATA = "multipart/form-data";        String CHARSET = "UTF-8";        URL uri = new URL(actionUrl);        HttpURLConnection conn = (HttpURLConnection) uri.openConnection();                        conn.setReadTimeout(5 * 1000);         conn.setDoInput(true);// 允许输入        conn.setDoOutput(true);// 允许输出        conn.setUseCaches(false);         conn.setRequestMethod("POST");  //Post方式        conn.setRequestProperty("connection", "keep-alive");        conn.setRequestProperty("Charsert", "UTF-8");                conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA                + ";boundary=" + BOUNDARY);                // 首先组拼文本类型的参数        StringBuilder sb = new StringBuilder();        for (Map.Entry<String, String> entry : params.entrySet()) {            sb.append(PREFIX);            sb.append(BOUNDARY);            sb.append(LINEND);            sb.append("Content-Disposition: form-data; name=\""                    + entry.getKey() + "\"" + LINEND);            sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);            sb.append("Content-Transfer-Encoding: 8bit" + LINEND);            sb.append(LINEND);            sb.append(entry.getValue());            sb.append(LINEND);        }                    DataOutputStream outStream = new DataOutputStream(conn                .getOutputStream());        outStream.write(sb.toString().getBytes());        // 发送文件数据        if (files != null)            for (Map.Entry<String, File> file : files.entrySet()) {                StringBuilder sb1 = new StringBuilder();                sb1.append(PREFIX);                sb1.append(BOUNDARY);                sb1.append(LINEND);                sb1                        .append("Content-Disposition: form-data; name=\"file\"; filename=\""                                + file.getKey() + "\"" + LINEND);                sb1.append("Content-Type: application/octet-stream; charset="                        + CHARSET + LINEND);                sb1.append(LINEND);                outStream.write(sb1.toString().getBytes());                InputStream is = new FileInputStream(file.getValue());                byte[] buffer = new byte[1024];                int len = 0;                while ((len = is.read(buffer)) != -1) {                    outStream.write(buffer, 0, len);                }                is.close();                outStream.write(LINEND.getBytes());            }                // 请求结束标志        byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();        outStream.write(end_data);        outStream.flush();        // 得到响应码        int res = conn.getResponseCode();         InputStream in = conn.getInputStream();        InputStreamReader isReader = new InputStreamReader(in);                BufferedReader bufReader = new BufferedReader(isReader);                String line = null;        String data = "OK";        while((line = bufReader.readLine())==null)            data += line;                if (res == 200) {            int ch;            StringBuilder sb2 = new StringBuilder();            while ((ch = in.read()) != -1) {                sb2.append((char) ch);            }        }        outStream.close();        conn.disconnect();        return  in.toString();    }}

以上如果要写入(上传)数据,这里使用的是out.write亦可使用out.wrtebyte(content)这样子也可以,省得在这里转换了,交给系统进行转换

这个可以根据个人的需要,加上等待条等等,如果要加上等待条的话,需要使用发送消息的方式进行,这个是我所想到的,其它的方式没有考虑好呢,有兴趣的人可以自己加上去!我在这里不再给增加了,增加的话,将在下载中添加一个下载的进度提示条。

实现内容如下:

Button btn1;    EditText view1;    EditText text1;    String SDPath = "/sdcard/";    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        view1 = (EditText) findViewById(R.id.view1);        text1 = (EditText) findViewById(R.id.edit1);        btn1 = (Button) findViewById(R.id.btn1);        btn1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                getFile();                try {                    String name=URLEncoder.encode(text1.getText().toString(),"utf-8");                    Map<String, String> params = new HashMap<String, String>();                    params.put("NAME", name);                    Map<String, File> files = new HashMap<String, File>();                    files.put(getFile(), new File("/sdcard/"+getFile()));                 view1.setText(PostFile.post("http://wdsl.recordinfo.tk/default.aspx", params, files));                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        });    }    String getFile() {        File file = new File(SDPath);        File[] files = file.listFiles(new fileFilter());        String filename = "";        for (File file1 : files) {            filename = file1.getName();        }        Toast.makeText(this, filename, Toast.LENGTH_LONG).show();        return filename;    }    class fileFilter implements FilenameFilter {        @Override        public boolean accept(File dir, String filename) {            // TODO Auto-generated method stub            return filename.endsWith(".gif");        }    }

这些只是类里面的内容,并且我只取了SD卡上的一张照片,因此我就在卡上放了一张照片,所以没有进行列表处理,有兴趣的话,可以自己添加上去,因为我主要是实现这一功能,对这一功能进行练习!

要使用SD卡和网络,相应的权限需要加上,因为在前面已经有了,这里将不写赘述。

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. android Notification 的使用
  6. 使用 Eclipse PhoneGap 构建 Android(安卓)应用程序入门
  7. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
  8. Android之使用XMLPull解析xml(二)
  9. android:layout_weight之我见

随机推荐

  1. Markdown语法小结和HTML标签学习小结
  2. 0316html
  3. 3.16作业
  4. sai怎么画磨砂质感?磨砂质感画法教程
  5. HTML基础标签练习作业
  6. 【北亚数据恢复】服务器误删除卷导致raid
  7. Markdown常用语法练业作业
  8. Vue2 composition-api 升级
  9. 农村物流配送管理如何走出困境?捷码有方案
  10. 小推理:React18比老版React更优秀的一个地