利用AndServer框架把安卓手机变成Web服务器实现局域网文件上传、下载功能

一、前言

  • AndServer框架的作者是严振杰,关于该框架的使用方法,他的博客有对应的文章。不过,该文章有些老旧了,因为上边给出的github项目与该文章所讲的并不匹配。即使是下载了sample,菜鸟也不知道如何实现文件的下载功能,因为sample里面只有文件上传的例子。为此,本人阅读了其他博主相关的文章,自己实现了文件上传、下载的功能。
  • AndServer框架可以把安卓手机变身为一台Web服务器,其他设备只需要和该手机连接同一个网络,在浏览器输入相应的地址,就可以访问、操作该手机(Web服务器)上的资源。
  • 本篇文章的最后会免费给出整个项目的源码以及成品软件。

二、截图

1、浏览器截图

在这里插入图片描述
在这里插入图片描述

2、手机(Web服务器)截图

在这里插入图片描述

三、关键代码

1、说明

a、AS版本

开发此项目本人使用的Android Studio版本是4.1.1

b、添加依赖

本人使用的AndServer版本为1.1.3,需要在Module的build.gradle文件里面添加如下依赖:

implementation 'com.yanzhenjie:andserver:1.1.3'

c、前端用到的框架

本篇文章就不给出前端的代码了,因为用到的都是最基础的知识,前端只是单纯地展示一下后端返回的数据而已。前端用到的框架主要有Bootstrap、Jquery。

2、生成Server对象代码

Server.Builder builder = AndServer.serverBuilder();
        builder.inetAddress(NetUtils.getLocalIPAddress());
        builder.port(port);
        WebSite webSite=new AssetsWebsite(getAssets(),"web");//网站是放在assets/web目录下的
        builder.website(webSite);//部署网站
        builder.registerHandler("/fileDownload",new FileDownloadHandler());
        builder.registerHandler("/fileUpload",new FileUploadHandler());
        builder.registerHandler("/fileList",new FileListHandler());
        builder.registerHandler("/fileDel",new FileDeleteHandler());
        builder.listener(new Server.ServerListener() {
            @Override
            public void onStarted() {
                LogUtils.logD(TAG,"服务器启动完成……");
                hostAddress = mServer.getInetAddress().getHostAddress();
                System.out.println("主机地址是:"+hostAddress);
                MybroadcastReceiver.onServerStart(CoreService.this,hostAddress);
            }

            @Override
            public void onStopped() {
                LogUtils.logD(TAG,"服务器已停止……");
                MybroadcastReceiver.onServerStop(CoreService.this);
            }

            @Override
            public void onError(Exception e) {
                LogUtils.logD(TAG,"服务器发生错误,错误信息:"+e.getMessage());
                MybroadcastReceiver.onServerError(CoreService.this,e.getMessage());
            }
        });
        mServer= builder.build();//构建出Server对象

3、文件上传的代码

public class FileUploadHandler implements RequestHandler {
    @Override
    public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
        File file=new File(FileUtils.fileDirectory);//临时文件的存放目录
        FileItemFactory fileItemFactory = new DiskFileItemFactory(10*1024 * 1024, file);//第一个参数是缓存的大小
        HttpFileUpload httpFileUpload=new HttpFileUpload(fileItemFactory);
        String name=null;
        boolean isFinished=false;
        String errMsg="";
        try {
            List<FileItem> fileItemList = httpFileUpload.parseRequest(request);
            for (FileItem fileItem : fileItemList) {
                if(fileItem.isFormField()){//普通参数
                    name = fileItem.getName();
                    String string = fileItem.getString();
                    System.out.println("上送的参数名:"+name+",参数值:"+string);
                }else{//文件
                    String fieldName = fileItem.getFieldName();
                    long size = fileItem.getSize();//文件大小
                    String contentType = fileItem.getContentType();
                    if(name==null||name.length()<2){
                        name=fileItem.getName();
                    }
                    System.out.println("上传的参数,文件大小:"+size+"字节,文件名:"+name+",类型:"+contentType+",表单名字:"+fieldName);
                    File uploadFile=new File(file,name);
                    fileItem.write(uploadFile);//将文件写入存储卡中
                    isFinished=true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            errMsg=e.getMessage();
        }

        if(isFinished){
            response.setEntity(new StringEntity("文件上传完成!","utf-8"));
        }else {
            response.setEntity(new StringEntity("文件上传失败,服务器未接收到任何文件!错误信息:"+errMsg,"utf-8"));
        }
        response.setHeader("Content-Type","text/html;charset=utf-8");
    }
}

4、文件下载的代码

public class FileListHandler implements RequestHandler {
    @RequestMapping(method={RequestMethod.GET})
    @Override
    public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException {
        /*String contentFromBody = HttpRequestParser.getContentFromBody(request);//从请求体中获取数据
        System.out.println("请求体:"+contentFromBody);
        String substring = contentFromBody.substring(5, contentFromBody.length());
        String decode= URLDecoder.decode(substring, "utf-8"); */

        String uri = request.getRequestLine().getUri();
        String fileName= uri.substring(10, uri.length());
        String decode = URLDecoder.decode(fileName, "utf-8");
        System.out.println("请求的URI是:"+uri);
        System.out.println("文件名是:"+fileName);
        System.out.println("解码后的文件名:"+decode);
        FileEntity fileEntity=new FileEntity(new File(FileUtils.fileDirectory+"/"+decode));
        response.setHeader("Content-Disposition", "attachment;filename="+decode);//不设置这个就没有下载的效果,举例:如果是txt文件,浏览器就会直接展示文字,而不是下载
        response.setEntity(fileEntity);

    }
}

四、项目地址及软件成品

  • 项目已经托管在码云上(今天针对安卓11以上版本做了适配2022-06-03),点我跳转至码云(https://gitee.com/infinite_bitterness_covers_god/unbounded-sharing)。
  • 软件成品下载,链接:https://pan.baidu.com/s/12w8DkWRK-lQBw414wDimUg?pwd=i4qu
    提取码:i4qu
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值