zoukankan      html  css  js  c++  java
  • Android 文件的上传

    因为工作需要,暂时没有对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卡和网络,相应的权限需要加上,因为在前面已经有了,这里将不写赘述。

    作者:码农豆豆
    微信公众号:
    出处:http://www.cnblogs.com/fly_binbin/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    Volatile vs. Interlocked vs. lock
    TransactionScope IsolationLevel 事务隔离级别
    C# LinqAggregate
    .net线程入门1进程
    删除centos更新后多余的内核
    网页中怎么导入css的3方式
    面试常用基础理论(三)
    面试常用基础理论(四)
    Jmeter基本概念
    面试常用基础理论(二)
  • 原文地址:https://www.cnblogs.com/fly_binbin/p/1910273.html
Copyright © 2011-2022 走看看