Android往Web服务器发送文件

今天的任务是让android往web服务器发送文件,测试的时候,从字符串开始测起,然后是发送txt文件,最后是发送图片;测试字符串以及带中文的txt时,遇见了中文乱码的情况,浏览了很多大神发布到博客上的分享,感觉自己学到了不少,在这里不一一列出。

好的,重点来了,这一次想要分享我今天实验的最终结果:可以传送txt、图片、压缩包的客户端以及服务端代码:

先看运行结果:

图1.发送前




图2 手机端的文件目录




发送后:


图3 电脑端已经接收到pcs.rar



对比两份文件的属性:


图4 电脑端的压缩包文件属性



                                        

图5.手机端压缩包的文件属性




打开服务端接收到的文件夹,看看是否出现乱码:




效果展示完了,现在说一下心得,就一句话:二进制真的很神奇,这一次传送文件,完全没怎么考虑编码解码的事情,不过有点遗憾的是:用HTTP来收发文件会有限制,不能

发送太大的文件,不然会超时,服务器会报警~~



最后一个环节,上代码:

android端:

 

    public void mtest(){
        //构建URL的格式为:    http://IP地址:监听的端口号/Servlet的路径
        final String strUrl = "http://175.0.154.126:8080/uploadimageServlet";
        //文件路径+文件名  [此处最好是把文件格式给带上]
        final String filepath = "/mnt/sdcard2/zmaee/pcs.rar";
        final URL[] url = {null};
        Thread th=new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    String content = null;
                    try {
                        content = "?command=" + URLEncoder.encode("upload image", "UTF-8")+"&filename="+ URLEncoder.encode("pcs.rar", "UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    //第一步:访问网站,进行连接
                    url[0] =new URL(strUrl+content);
                    HttpURLConnection urlConn=(HttpURLConnection) url[0].openConnection();
                    urlConn.setDoInput(true);       //setting inputstream using bytestream
                    urlConn.setDoOutput(true);
                    urlConn.setRequestMethod("POST");
                    urlConn.setUseCaches(false);
                    urlConn.setRequestProperty("Content-Type","application/x-ww-form-urlencoded");  //
                    urlConn.setRequestProperty("Charset","utf-8");
                    urlConn.connect();


                    //第二步:打开数据通道
                    DataOutputStream dop=new DataOutputStream(urlConn.getOutputStream());

                    //第三步:准备好发送的数据
                    File f=new File(filepath);
                    FileInputStream fis=new FileInputStream(f);
                    if(f.isFile()){
                        byte[] buffer=new byte[1024];
                        int length=0;
                        while ((length=fis.read(buffer))!=-1){
                            dop.write(buffer,0,length);
                        }
                    }else {         //如果不是文件,直接返回,然后啥也不干
                        return;
                    }

                    //第四步:将准备的数据发送给服务器
                    dop.flush();
                    dop.close();

                    //第五步:打开输入的数据通道,等待服务端回发数据!
                    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
                    String result="";
                    String readLine=null;
                    while ((readLine=bufferedReader.readLine())!=null){
                        result+=readLine;
                    }
                    //最后一步:清理场地,主要是把打开的通道都关闭掉,养成一个好习惯
                    bufferedReader.close();
                    urlConn.disconnect();
                    //调试返回的数据
                    System.out.println("从服务端获得的返回数据为:  "+ URLDecoder.decode(result,"utf-8"));

                }catch (MalformedURLException e){
                    System.out.println("出现了异常:"+e.getMessage());
                } catch (IOException e) {
                    System.out.println("出现了异常:"+e.getMessage());
                    e.printStackTrace();
                }
            }
        });
        th.start();

    }


服务端:

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String command_str=URLDecoder.decode(new String(request.getParameter("command").getBytes(),"utf-8"));
        String filename_str=new String(request.getParameter("filename").getBytes("iso8859-1"),"utf-8");
        String fullFileName=filename_str;

        System.out.println("从客户端收到的消息为:\n命令 :"+command_str+"\n文件名:"+filename_str);
        String path="G:/niki/upload/";//构建上传路径
        response.setCharacterEncoding("utf-8");


            FileWriter fw=new FileWriter(path+"\\"+filename_str,true);
            File f=new File(path+"\\"+filename_str);
            if(!f.exists()){
                f.createNewFile();

            }
           FileOutputStream fos=new FileOutputStream(f);

            byte[] buffer=new byte[1024];
            InputStream inputStream=request.getInputStream();
            int length;

            byte[] temp=new byte[1024];
            PrintWriter printWriter=response.getWriter();
            int count=0;
            while ((length=inputStream.read(buffer))!=-1){
                // fw.write(URLDecoder.decode(new String(buffer,2,length-2).replace("%","%25"),"UTF-8"));//部分中文没有被翻译正确
                //      temp= new Base64.Decoder(buffer);
                fos.write(buffer,0,length);
                //  fw.write(URLDecoder.decode(new String(buffer,2,length-2).replace("%","%25"),"iso8859-1"));
                count+=length;
                System.out.println("现在的保存进度为:"+count);
            }
            fos.close();
            fw.close();

            printWriter.write("服务器已经收到文件了");

    }



分享结束,如果这两段代码,读者还有其他疑问,欢迎留言~

谢谢大家的阅读害羞


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值