简单易懂SpringBoot和Android上传和下载文件方案——采用URL

上传思路

  1. SpringBoot把文件保存在静态资源里,并且开启静态资源访问
  2. 数据库保存文件的URL地址(URL地址是一个字符串)
  3. Android采用OkHttp上传文件

下载思路

  1. SpringBoot从数据库获取URL地址发送给Android
  2. Android利用URL地址下载文件

上传关键代码

  1. 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);
            }
        });
    }
  1. 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);
    }

}

下载文件关键代码

  1. SpringBoot

返回保存在数据库的URL地址和文件名

  1. 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();
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值