安卓客户端与服务器间文件的下载与上传

        本人最近在写一个安卓应用,里面涉及到用户头像的下载与上传,这也是当下每一个涉及到账户的安卓客户端基本都要实现的功能,当然方法肯定有很多种,本文就介绍下我的实现方法,与大家一起学习。服务器部分是用servlet实现的,架构在Tomcat之上,本文将分为文件下载与上传两个部分。

        首先是文件从服务器下载部分。将要下载的部分直接扔在Tomcat安装目录下webapps文件夹中的ROOT文件夹中,比如本人的路径是G:\Tomcat\webapps\ROOT。然后本地ip为114.212.81.120,Tomcat使用的端口为8001(端口和ip都是因人而异的),那么可以设置访问的url为“http://114.212.81.120:8001/文件名”,浏览器访问这个url也可以直接下载。自己写代码的话可以通过url先创建输入流,根据本地文件路径创建输出流,然后使用缓冲进行下载,不至于占用太多内存。比如如下代码的功能是下载一个图片touxiang.png,这个文件路径为"G:\Tomcat\webapps\ROOT\touxiang.png",具体过程已经注释很清楚了。

    String localpath = Environment.getExternalStorageDirectory()+"/downloalimg/";//先创建本地文件夹
    File folder = new File(localpath);//文件夹
    if(!folder.exists())//确保本地有文件夹
        folder.mkdir();
    //如果图片已经存在,删除之后更新
    String filepath = localpath + "touxiang.png";
    File file = new File(filepath);	        		
    if(file.exists())
        file.delete();
    URL url = new URL("http://114.212.81.120:8001/touxiang.png");
    URLConnection con = url.openConnection();
    InputStream is = con.getInputStream();//创建输入流
    byte[] bs = new byte[1024];//创建1k的数据缓冲流
    int len;//读取到的数据长度
    OutputStream os = new FileOutputStream(file);//创建输出流
    while((len = is.read(bs)) != -1)
        os.write(bs, 0, len);
    os.close();
    is.close();
        然后是文件上传服务器,同样文件准备直接上传到Tomcat安装目录下webapps文件夹中的ROOT文件夹,本人的路径为G:\Tomcat\webapps\ROOT,ip和端口也和前面的一样一样的。创建的网络项目名称为ServletUploadDemo,那么在servlet中,比如servlet的文件名为UploadServlet,那么客户端连接服务器的url可以为"http://114.212.81.120:8001/ServletUpLoadDemo/UploadServlet"。客户端的代码如下,要上传的文件为##touxiang.png:

    private String end = "\r\n";
    private String twoHyphens = "--";
    private String boundary = "******";
    URL url = new URL("http://114.212.81.120:8001/ServletUpLoadDemo/UploadServlet");
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    httpURLConnection.setDoInput(true);//下面是一些连接属性的设置
    httpURLConnection.setDoOutput(true);
    httpURLConnection.setUseCaches(false);
    httpURLConnection.setRequestMethod("POST");
    httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
    httpURLConnection.setRequestProperty("Charset", "UTF-8");
    httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
    httpURLConnection.connect();//这一句可以不写,因为下一句中的httpURLConnection.getOutputStream()包含了connect()的过程
    DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
    dos.writeBytes(twoHyphens + boundary + end);
    dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
            + "##touxiang.png"
            + "\"" + end);
    dos.writeBytes(end);
    FileInputStream fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/downloalimg/##touxiang.png");
    byte[] buffer = new byte[1024]; //缓冲区1k
    int count = 0;
    while ((count = fis.read(buffer)) != -1) {
        dos.write(buffer, 0, count);
    }
    fis.close();
    dos.writeBytes(end);
    dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
    dos.flush();
    //再调用下边的getInputStream()函数时才将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端
    InputStream is = httpURLConnection.getInputStream();//这句话一定要写,不然会发现根本和servlet都没有交互
    dos.close();
    is.close();
对应服务器对应的代码如下,其中doPost()为override的一个函数,
public void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
    try {
        request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式
        // 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据
        FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 分析请求,并得到上传文件的FileItem对象
        List<FileItem> items = upload.parseRequest(request);
        String filename = ""; // 上传文件保存到服务器的文件名
        InputStream is = null; // 当前上传文件的InputStream对象
        // 循环处理上传文件
        for (FileItem item : items) {
            // 处理普通的表单域
            if (item.isFormField()) {
                if (item.getFieldName().equals("filename")) {
                    // 如果新文件不为空,将其保存在filename中
                    if (!item.getString().equals(""))
                        filename = item.getString("UTF-8");
	        }
            }
            // 处理上传文件
            else if (item.getName() != null && !item.getName().equals("")) {
                // 从客户端发送过来的上传文件路径中截取文件名
                filename = item.getName().substring(item.getName().lastIndexOf("\\") + 1);
                is = item.getInputStream(); // 得到上传文件的InputStream对象
            }
        }
        //对filename进行提取: "##touxiang.png" 提取出文件名touxiang.png
        filename = filename.substring(2);
        // 将路径和上传文件名组合成完整的服务端路径
        String uploadpath = "G:\\Tomecat\\webapps\\ROOT\\";
        filename = uploadpath + filename;
        // 如果服务器已经存在和上传文件同名的文件,则删除该头像
        if (new File(filename).exists()) {
             new File(filename).delete();
        }
        // 开始上传文件
        if (!filename.equals("")) {
             // 用FileOutputStream打开服务端的上传文件
             FileOutputStream fos = new FileOutputStream(filename);
             byte[] buffer = new byte[8192]; // 每次读8K字节
             int count = 0;
             // 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
             while ((count = is.read(buffer)) > 0) {
                 fos.write(buffer, 0, count); // 向服务端文件写入字节流
             }
             fos.close(); // 关闭FileOutputStream对象
             is.close(); // InputStream对象
         }
    }
    catch (Exception e) {}
}
当然上传或者下载的文件也不一定要存在"G:\Tomcat\webapps\ROOT\"下,也可以放在ROOT下的某个文件夹中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值