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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
    UI Recorder 自动化测试 回归原理(九)
    UI Recorder 自动化测试 录制原理(八)
    UI Recorder 自动化测试 整体架构(七)
    UI Recorder 自动化测试 配置项(六)
    UI Recorder 自动化测试 工具栏使用(五)
    UI Recorder 自动化测试 回归测试(四)
    UI Recorder 自动化测试 录制(三)
    UI Recorder 自动化测试工具安装问题疑难杂症解决(二)
    UI Recorder 自动化测试安装教程(一)
  • 原文地址:https://www.cnblogs.com/fly_binbin/p/1910273.html
Copyright © 2011-2022 走看看