看到标题,估计各位看官有点懵,访问SD卡中的文件,你连上数据线不就行了,或者说你想要获取一些数据,你用及时通讯(微信,钉钉,QQ等等),在线传输不就行了,这些都可以的啊,有什么难的吗?哎,各位小老弟,还真有一种情况的出现,我们公司就是一个特例,每个人的电脑,都屏蔽了USB访问设备的权限,也就是说,你是硬盘,U盘,还是数据线,插上后,是没有权限查看文件的,想要从电脑往手机传输东西,或者说从手机往电脑传输东西,依靠的是及时通讯工具或者其它可用的工具。
针对这种情况的出现,不可能每个测试机里,我们都不断的登录一些及时通讯(微信,QQ等)的账号,况且这些传输文件,依赖性太强,也无法满足我们传输到某一个位置的需求,基于这种情况,看到了yanzhenjie开源的AndServer,这是一个基于Android系统的一个服务,可以实现网站的部署,还有动态api形式的访问,是非常强大的,大家可以点击直接看相关文档:https://yanzhenjie.com/AndServer/。
基于AndServer所提供的功能,是不是我们就可以以自己的手机做为一个服务器,来部署一个网站呢?这个必须可以,AndServer中已经提供了部署的方式,部署完毕后,无非就是,电脑端访问服务器(也就是自己手机)里的各个文件,目前呢,基于AndServer开发的在线浏览文件及上传下载Demo已经开源,地址是:
https://github.com/AbnerMing888/SdFileManager,大家有需要的可以下载。
具体的效果如下图,电脑和手机必须连接同一网络,运行至手机之后,就可以打开服务,在电脑端输入对应的地址,就可以查看手机SD卡里的文件,也可以进行上传,或者删除。
PC端效果:
目前上传,是上传到你选择的路径下,同样的删除,也需要你在路径后,把文件的名字追加到路径后面。
Demo中重点的逻辑,有两个,一个是获取手机SD卡的各个文件路径,一个是上传和删除文件。
获取文件
/*** 返回文件列表*/path="/list") (List<FileInfo>getFileList( (name="rootPath", required=false) StringrootPath) { Filefile; if (TextUtils.isEmpty(rootPath)) { file=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()); } else { file=newFile(rootPath); } List<FileInfo>fileInfoList=newArrayList<>(); if (!file.isDirectory()) { returnfileInfoList; } File[] list=file.listFiles(); if (list==null||list.length==0) { returnfileInfoList; } FileInfofileInfo; for (Filef : list) { Stringname=f.getName(); fileInfo=newFileInfo(); fileInfo.setName(name); fileInfo.setUrl(f.getAbsolutePath()); fileInfo.setDateModified(f.lastModified()); fileInfo.setDateModifiedString(TimeUtils.INSTANCE.formatDateToStr(f.lastModified(), "yyyy/MM/dd aHH:mm:ss")); if (f.isFile()) { fileInfo.setIsDir(0); fileInfo.setSize(f.length()); fileInfo.setSizeString(FileUtils.formatFileSize(f.length())); } else { fileInfo.setIsDir(1); } fileInfoList.add(fileInfo); } returnfileInfoList; }
上传文件:
"/upload") (StringuploadFile( name="path") Stringpath, (name="file") MultipartFilemultipartFile) { (Filedir=Environment.getExternalStorageDirectory(); if (!"-1".equals(path)) { //证明为空dir=Environment.getExternalStoragePublicDirectory(path); } try { StringfileName=multipartFile.getFilename(); StringfilePath=dir+"/"+fileName; InputStreaminputStream= (multipartFile.getStream()); FileOutputStreamfileWriter=newFileOutputStream(filePath); byte[] bytes=newbyte[1024]; intlength; while ((length=inputStream.read(bytes)) >0) { fileWriter.write(bytes, 0, length); fileWriter.flush(); } inputStream.close(); fileWriter.close(); } catch (IOExceptione) { e.printStackTrace(); returne.getMessage(); } returnmultipartFile.getFilename(); }
删除文件
"/deleteFile") (StringdeleteFile( name="path") Stringpath) { (Filefile=newFile(path); if (file.exists()) { file.delete(); } return"删除成功"; }