android 使用httpURLConnection 传输文件

韦爵爷 发布于 2013/05/31 15:41
阅读 2K+
收藏 1

我想在android 上使用httpURLConnection 往pc传文件。

 HttpURLConnection conn = (HttpURLConnection)server_url.openConnection(); 

执行下面这句话时失败,直接跳到catch语句块中。 

OutputStream dos = conn.getOutputStream(); 

相当于执行conn.connect()异常 。 不知道为什么会这样,调了一天了,求大神们帮忙

加载中
0
JerrySher
JerrySher

这个不好说,简单这几行代码看不出什么端倪。 

猜测有这么几种可能

  1. 你没有添加 Intent权限
  2. 你的server_url  本上就就有问题  查看一下地址是否写错了。 
  3. 查看你下你的手机的网络情况 是不是压根就没有网络或者手机网络屏蔽了你需要访问的url

最后提醒你 。 既然调到了  catch语句块  那么一定是有 log输出的  你可以尝试下分析一下log记录  尝试解决 。

顺便 ,如果问问题的时候有log记录 可以附上log记录 分别查找问题所在。 


0
理工男海哥
韦爵爷
嗯 我学习一下
0
pseudo
pseudo
conn.setDoOutput(true),如果要取得connection的输入流来读取返回数据,conn.setDoInput(true),这两个方法要在connection的connect()前调用( URLConnection objects go through two phases: first they are created, then they are connected. After being created, and before being connected, various options can be specified (e.g., doInput and UseCaches). After connecting, it is an error to try to set them.
0
韦爵爷

引用来自“Chauvet”的答案

conn.setDoOutput(true),如果要取得connection的输入流来读取返回数据,conn.setDoInput(true),这两个方法要在connection的connect()前调用( URLConnection objects go through two phases: first they are created, then they are connected. After being created, and before being connected, various options can be specified (e.g., doInput and UseCaches). After connecting, it is an error to try to set them.
我的代码是这样的,应该是没有问题的,可是一直不对  好无力啊
URL server_url = new URL( "http://10.108.39.50/GetAndroidFile/receive_file.php");
String fileName = upload_files[i].getName();
HttpURLConnection conn = (HttpURLConnection)server_url.openConnection();
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setUseCaches(false);
    conn.setRequestMethod("POST");
           conn.setRequestProperty("connection", "Keep-Alive");  
    conn.setRequestProperty("Charset","UTF-8");
   //设置表单类型和边界符号
    conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+BOUNDARY);
    //http头部
StringBuffer sb = new StringBuffer();
    sb.append("--");
    sb.append(BOUNDARY);
    sb.append("\r\n");
    sb.append("Content-Disposition: form-data; name=\"uploadedfiles\"; filename=\""+fileName+"\""+"\r\n");
    sb.append("Content-Type: application/octet-stream; charset=UTF-8\r\n\r\n");
   
    byte []data = sb.toString().getBytes();
    byte []end_data = ("\r\n--"+BOUNDARY+"--\r\n").getBytes();
    conn.setRequestProperty("Content-Length", String.valueOf(data.length+upload_files[i].length()+end_data.length));
       
//     DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
    OutputStream dos = conn.getOutputStream();
    dos.write(data);
   
    FileInputStream fis = new FileInputStream(upload_files[i]);
   
    int count = 0;
    byte []buff = new byte[1024*8];
    while((count = fis.read(buff))!=-1)
    {
    dos.write(buff,0,count);
    }
    fis.close();
    dos.write(end_data);
    dos.flush();
    dos.close();
   
    InputStream is = conn.getInputStream();
    is.close();
韦爵爷
回复 @Chauvet : 嗯 谢谢你的回答 这个问题解决了 因为android在3.0以后规定httpurlconnection的操作不能放在UI线程里做。重新开一个子线程做就好了。
pseudo
pseudo
你的应用设置访问网络权限了么
pseudo
pseudo
看看这个文章http://www.codicode.com/art/upload_files_from_android_to_a_w.aspx
返回顶部
顶部