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. Android设备与外接U盘实现数据文件夹拷贝到android设备
  2. Android中音乐文件的信息详解【安卓源码解析二】
  3. Android 数据存储方式
  4. android ZygoteInit.java文件解析 从main(String args[])开始
  5. android 如何调用选择文件模块
  6. android文件系统挂载分析(1)---正常开机挂载,分区信息解读
  7. android往文件中保存和读取数据
  8. Android 文件打开方式

随机推荐

  1. [置顶] Android学习路线指南
  2. android优化 清除无效代码 UCDetector
  3. android下使用gdb调试工具笔记
  4. android启动过程详解(一)——解析init.rc
  5. android notification通知栏及8.0适配
  6. 修正Android摄像头API
  7. 通过Ant将android project打包成apk并安
  8. android按键驱动开发实例1(修改一个按键)
  9. android的学习记录-包括android的安装、
  10. Android Studio安装配置(详细版)