上传思路
- SpringBoot把文件保存在静态资源里,并且开启静态资源访问
- 数据库保存文件的URL地址(URL地址是一个字符串)
- Android采用OkHttp上传文件
下载思路
- SpringBoot从数据库获取URL地址发送给Android
- Android利用URL地址下载文件
上传关键代码
- Android
/**
上传文件代码
* @param url 请求服务器路径
* @param filePath
* @param fileName
* @param listener 回调函数
*/
public void upload(String url,String filePath, String fileName, Callback listener){
new Thread(new Runnable() {
@Override
public void run() {
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", fileName,
RequestBody.create(MediaType.parse("multipart/form-data"), new File(filePath)))
.build();
Request request = new Request.Builder()
.url(baseURL + url)
.post(requestBody)
.build();
client.newCall(request).enqueue(listener);
}
});
}
- SpringBoot
@PostMapping("/save")
public void save(MultipartFile file, HttpServletRequest request) throws IOException {
// 保存文件目录,在静态资源里
File path = ResourceUtils.getFile("classpath:");
File uploadDir = new File(path.getAbsolutePath(),"static/file/");
if(!uploadDir.exists())
{
uploadDir.mkdirs();
}
log.info("文件目录:" + uploadDir.getAbsolutePath());
// 保存文件路径
String fileName = UUID.randomUUID() + file.getOriginalFilename();
String filePath = uploadDir.getAbsolutePath() + "\\" + fileName ;
log.info("文件保存路径:" + filePath);
// 保存文件
File saveFile = new File(filePath);
file.transferTo(saveFile);
// 保存文件信息到数据库,自己根据表保存
// 文件名
String dataFileName = file.getOriginalFilename();
// RUL地址
String fileAddress = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/static/file/" + fileName;
return ;
}
记得开启静态资源访问
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 配置静态资源
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
}
下载文件关键代码
- SpringBoot
返回保存在数据库的URL地址和文件名
- Android
// 网络操作采用子线程
new Thread(new Runnable(){
@Override
public void run() {
URL url = null;
try {
// fileAddress是从后端返回的RUL地址
url = new URL(fileAddress);
InputStream inputStream = url.openStream();
// 文件保存目录路径
String dirName = parentContext.getExternalFilesDir(null).getPath() + "/MyDownLoad/";
// 文件目录
File fileDir = new File(dirName);
//目录不存在创建
if (!fileDir.exists()) {
boolean is = fileDir.mkdirs();
Log.d("FileAdapter.class", "创建目录是否成功:" + is);
}
// 文件路径 dataFileName是后端放回的文件名
String fileName = dirName + dataFileName;
File file = new File(fileName);
if(file.exists()){
file.delete();
}
// 创建文件
boolean is = file.createNewFile();
Log.d("FileAdapter.class", "创建文件是否成功:" + is);
// 写文件数据
//创建字节流
byte[] bs = new byte[1024];
int len;
OutputStream os = new FileOutputStream(fileName);
//写数据
while ((len = inputStream.read(bs)) != -1) {
os.write(bs, 0, len);
}
//完成后关闭流
os.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();