看到标题,估计各位看官有点懵,访问SD卡中的文件,你连上数据线不就行了,或者说你想要获取一些数据,你用及时通讯(微信,钉钉,QQ等等),在线传输不就行了,这些都可以的啊,有什么难的吗?哎,各位小老弟,还真有一种情况的出现,我们公司就是一个特例,每个人的电脑,都屏蔽了USB访问文件的权限,也就是说,你是硬盘,U盘,还是数据线,插上后,是没有权限查看文件的,想要从电脑往手机传输东西,或者说从手机往电脑传输东西,依靠的是及时通讯工具或者其它可用的工具。
针对这种情况的出现,不可能每个测试机里,我们都不断的登录一些及时通讯(微信,QQ等)的账号,况且这些传输文件,依赖性太强,也无法满足我们传输到某一个位置的需求,基于这种情况,看到了yanzhenjie开源的AndServer,这是一个基于Android系统的一个服务,可以实现网站的部署,还有动态api形式的访问,是非常强大的,大家可以直接看相关文档:
https://yanzhenjie.com/AndSer...。
基于AndServer所提供的功能,是不是我们就可以以自己的手机做为一个服务器,来部署一个网站呢?这个必须可以,AndServer中已经提供了部署的方式,部署完毕后,无非就是,电脑端访问服务器(也就是自己手机)里的各个文件,目前呢,基于AndServer的Demo已经开源,地址是:https://github.com/AbnerMing8...,大家有需要的可以下载。
具体的效果如下图,电脑和手机必须连接同一网络,运行至手机之后,就可以打开服务,在电脑端输入对应的地址,就可以查看手机SD卡里的文件,也可以进行上传,或者删除。
手机端:
PC端效果:
目前上传,是上传到你选择的路径下,同样的删除,也需要你在路径后,把文件的名字追加到路径后面。
Demo中重点的逻辑,有两个,一个是获取手机SD卡的各个文件路径,一个是上传和删除文件。
获取文件
/**
* 返回文件列表
*/
@GetMapping(path = "/list")
List<FileInfo> getFileList(@RequestParam(name = "rootPath", required = false) String rootPath) {
File file;
if (TextUtils.isEmpty(rootPath)) {
file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
} else {
file = new File(rootPath);
}
List<FileInfo> fileInfoList = new ArrayList<>();
if (!file.isDirectory()) {
return fileInfoList;
}
File[] list = file.listFiles();
if (list == null || list.length == 0) {
return fileInfoList;
}
FileInfo fileInfo;
for (File f : list) {
String name = f.getName();
fileInfo = new FileInfo();
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);
}
return fileInfoList;
}
上传文件:
@PostMapping("/upload")
String uploadFile(
@RequestParam(name = "path") String path,
@RequestParam(name = "file") MultipartFile multipartFile) {
File dir = Environment.getExternalStorageDirectory();
if (!"-1".equals(path)) {
//证明为空
dir = Environment.getExternalStoragePublicDirectory(path);
}
try {
String fileName = multipartFile.getFilename();
String filePath = dir + "/" + fileName;
InputStream inputStream = (multipartFile.getStream());
FileOutputStream fileWriter = new FileOutputStream(filePath);
byte[] bytes = new byte[1024];
int length;
while ((length = inputStream.read(bytes)) > 0) {
fileWriter.write(bytes, 0, length);
fileWriter.flush();
}
inputStream.close();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
return multipartFile.getFilename();
}
删除文件
@PostMapping("/deleteFile")
String deleteFile(
@RequestParam(name = "path") String path) {
File file = new File(path);
if (file.exists()) {
file.delete();
}
return "删除成功";
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。