iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >基于gitee如何实现上传下载文件的功能
  • 952
分享到

基于gitee如何实现上传下载文件的功能

2023-07-05 16:07:06 952人浏览 安东尼
摘要

本文小编为大家详细介绍“基于gitee如何实现上传下载文件的功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于gitee如何实现上传下载文件的功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方案的选择文件

本文小编为大家详细介绍“基于gitee如何实现上传下载文件的功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于gitee如何实现上传下载文件的功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

方案的选择

文件的上传和下载是我们这个项目的核心功能,也是整合优化了一下以前的boot项目来实现这个功能。

对于文件的上传和下载一般是使用阿里云OSS、华为云OSS这些,很好用而且官方提供了图形界面,但是这些方式都需要按量储存收费并且和gitee相似都是去调用官方接口实现功能,因为我是在学习阶段,所以选择了在gitee搭建了一个仓库,利用官方的api向仓库发起文件的上传、删除功能,并且利用数据库储存的文件地址实现将文件下载到浏览器客户端。

数据库表的设计

数据库的表暂时只用了两张来实现基本功能,一个是文件表,一个是文件夹表

public class File {    @TableId(type = IdType.AUTO)    private Long id;    private String fileName;    private String filePath;    private String fileSize;    @TableField(fill = FieldFill.INSERT)    @JSONFORMat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    private Date createTime;    private Long userId;    private Long folderId;    //分享次数    private Integer shareTimes;    //文件描述    private String fileCover;}
public class Folder {    @TableId(type = IdType.AUTO)    private Long id;    private String folderName;    private Long fatherId;  //父文件夹id,为0表示没有最上层文件夹    private Long userId;    private String folderCover;    private Boolean folderPermissions;    @TableField(fill = FieldFill.INSERT)    @jsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")    private Date createTime;}

搭建gitee仓库

首先打开自己的gitee新建一个仓库,填写名称,勾选初始化仓库,创建好之后设置为开源

基于gitee如何实现上传下载文件的功能

仓库创建好之后打开“个人主页”—>“个人设置”---->“私人令牌”为自己生成一个新的私人令牌用于调用官方接口时的认证。

基于gitee如何实现上传下载文件的功能

生成时不用管选项直接生成,注意保存自己的令牌,因为只会展示一次。

gitee图床工具类的编写

这里用的别人写好的直接copy就行,注意里面的私人令牌、个人空间、仓库名、默认存储地址要改成自己的,这个工具类也就是利用这些信息通过HttpUtil工具类向gitee仓库发起上传请求。

package com.ityz.file.util;import cn.hutool.core.codec.Base64;import cn.hutool.http.HttpUtil;import cn.hutool.http.Method;import java.util.HashMap;import java.util.Map;import java.util.UUID;public class GiteeImgBedUtil {        private static final String ACCESS_TOKEN = "0616f0e894e3c264bac45591e34a43bc";  //这里不展示我自己的了,需要你自己补充        private static final String OWNER = "procedure-yuan-yanzu";        private static final String REPO = "files";        public static final String PATH = "files/";    //API        private static final String API_CREATE_POST = "https://gitee.com/api/v5/repos/%s/%s/contents/%s";        private static String createUploadFileUrl(String originalFilename,String path){        String targetPath = path == null ? GiteeImgBedUtil.PATH : path;        //获取文件后缀        String suffix = FileUtil.getFileSuffix(originalFilename);        //拼接存储的图片名称        String fileName = System.currentTimeMillis()+"_"+ UUID.randomUUID().toString()+suffix;        //填充请求路径        String url = String.format(GiteeImgBedUtil.API_CREATE_POST,                GiteeImgBedUtil.OWNER,                GiteeImgBedUtil.REPO,                targetPath + fileName);        return url;    }    private static String createDelFileUrl(String path){        //填充请求路径        String url = String.format(GiteeImgBedUtil.API_CREATE_POST,                GiteeImgBedUtil.OWNER,                GiteeImgBedUtil.REPO,                path);        return url;    }    private static String createGetUrl(String path){        String targetPath = path == null ? GiteeImgBedUtil.PATH : path;        //填充请求路径        String url = String.format(GiteeImgBedUtil.API_CREATE_POST,                GiteeImgBedUtil.OWNER,                GiteeImgBedUtil.REPO,                targetPath);        return url;    }        private static Map<String,Object> getUploadBodyMap(byte[] multipartFile){        HashMap<String, Object> bodyMap = new HashMap<>(3);        bodyMap.put("access_token", GiteeImgBedUtil.ACCESS_TOKEN);        bodyMap.put("message", "add file!");        bodyMap.put("content", Base64.encode(multipartFile));        return bodyMap;    }        private static Map<String,Object> getCommonBodyMap(HashMap map, String message){        HashMap<String, Object> bodyMap = new HashMap<>(2);        bodyMap.put("access_token", GiteeImgBedUtil.ACCESS_TOKEN);        bodyMap.put("message", message);        if (map != null){            bodyMap.putAll(map);        }        return bodyMap;    }        //超时    private static int TIMEOUT = 10 * 1000;        public static String uploadFile(String path, String originalFilename, byte[] data){        String targetURL = GiteeImgBedUtil.createUploadFileUrl(originalFilename,path);        //请求体封装        Map<String, Object> uploadBodyMap = GiteeImgBedUtil.getUploadBodyMap(data);        return HttpUtil.post(targetURL, uploadBodyMap);    }        public static String deleteFile(String path,String sha){        String delFileUrl = createDelFileUrl(path);        HashMap<String, Object> needMap = new HashMap<>(1);        needMap.put("sha",sha);//添加sha参数        return HttpUtil.createRequest(Method.DELETE, delFileUrl)                .form(getCommonBodyMap(needMap,"del file!"))  //构建请求表单                .timeout(TIMEOUT)                .execute().body();    }        public static String getSha(String path){        String getShaUrl = createDelFileUrl(path);        return HttpUtil.createRequest(Method.GET, getShaUrl)                .form(getCommonBodyMap(null, "get sha!"))                .timeout(TIMEOUT)                .execute().body();    }}

文件上传接口

文件上传的过程为前端传入文件对象和相关信息然后我们向gitee发起请求将文件传到仓库,上传成功之后在将返回的下载地址和相关信息存入数据库当中。

中间工具类

这里我们先来编写一个中间工具类来发起请求和拿到结果,这个代码也写在服务当中的话会显得代码太长太复杂所以我单独拿出来写。

import cn.hutool.json.JSONObject;import cn.hutool.json.JSONUtil;import com.ityz.common.constants.GiteeConstant;import lombok.extern.slf4j.Slf4j;import org.springframework.WEB.multipart.MultipartFile;import java.io.IOException;@Slf4jpublic class GiteeApi {        public static JSONObject upload(MultipartFile multipartFile,String folder) throws IOException {        log.info("uploadFile()请求已来临...");        //根据文件名生成指定的请求url        String originalFilename = multipartFile.getOriginalFilename();        if (originalFilename == null) {            log.info("服务器接收文件失败!");        }        //Gitee请求:发送上传文件请求        String JSONResult = GiteeImgBedUtil.uploadFile(folder, originalFilename, multipartFile.getBytes());        //解析响应JSON字符串        //上传txt文件时会出问题,没解决        JSONObject jsonObj = JSONUtil.parseObj(JSONResult);        //请求失败        if (jsonObj.getObj(GiteeConstant.RESULT_BODY_COMMIT) == null) {            log.info("上传文件失败!");        }        //请求成功:返回下载地址        JSONObject content = JSONUtil.parseObj(jsonObj.getObj(GiteeConstant.RESULT_BODY_CONTENT));        log.info("上传成功,下载地址为:" + content.getStr(GiteeConstant.RESULT_BODY_DOWNLOAD_URL));        return content;    }}

Controller

controller拿到文件和信息后调用中间工具类上传文件,然后从请求头中拿到用户id,从返回对象中拿到文件信息存入File类当中然后使用mybatisplus将对象存入数据库就行。

@RestController@Slf4j@RequestMapping("/file")public class FileController {    @Autowired    private FileService fileService;    @Autowired    private HttpServletRequest request;        @PostMapping("/upload")    public Result<String> uploadFile(@RequestParam("file") MultipartFile multipartFile            , @RequestParam("fileCover") String fileCover            , @RequestParam("folderId") Long folderId) throws IOException {        JSONObject content = GiteeApi.upload(multipartFile, "test/");        //获取userId        Long userId = Long.valueOf(TokenUtil.parseToken(request.getHeader("token")));        File file = new File();        file.setFileCover(fileCover);        file.setUserId(userId);        file.setFolderId(folderId);        file.setFileName(content.getStr(GiteeConstant.RESULT_BODY_NAME));;        file.setFileSize(content.getStr(GiteeConstant.RESULT_BODY_SIZE));        file.setFilePath(content.getStr(GiteeConstant.RESULT_BODY_DOWNLOAD_URL));        fileService.fileUpload(file);        return new Result<>(ResultCode.SUCCESS,ResultCode.UP_FILE_SUCCESS,content.getStr(GiteeConstant.RESULT_BODY_DOWNLOAD_URL));    }}

service比较简单,设置一个储存时间调用mapper存入就行

    @Override    public void fileUpload(File file) {        file.setCreateTime(new Date());        fileMapper.insert(file);    }

接口测试

我们随便上传一个文件

基于gitee如何实现上传下载文件的功能

查看gitee和数据库是否有相应结果

基于gitee如何实现上传下载文件的功能

这里id为2是因为之前删除了一条数据,想要从头开始截断表就行。

文件下载接口

文件下载最初比较困扰我,有两种方式,第一种是直接将文件对象写入到用户提供的本地文件夹地址,第二种是将文件下载到浏览器。最终选择了第二种方式,因为用户不用设置下载地址而且在浏览器下载可以看到下载过程,整个流程是利用下载地址将文件转换为文件流写入字节数组,在利用浏览器通过下载的方式写出字节数组到输出流。

controller

使用文件id先从数据库查到相应地址然后利用地址完成后续操作。

    @GetMapping("/download")    public Result<String> download(Long fileId,HttpServletResponse response) {        try {            String downloadUrl = fileService.downloadFile(fileId);            URL url = new URL(downloadUrl);            URLConnection conn = url.openConnection();            InputStream bis = conn.getInputStream();            byte[] bytes = new byte[bis.available()];            OutputStream os = response.getOutputStream();            // 从文件流读取字节到字节数组中            while (bis.read(bytes) != -1) {                // 重置 response                response.reset();                // 设置 response 的下载响应头                response.setContentType("application/x-download");                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(FileUtil.getFileName(downloadUrl), "UTF-8"));  // 注意,这里要设置文件名的编码,否则中文的文件名下载后不显示                // 写出字节数组到输出流                os.write(bytes);                // 刷新输出流                os.flush();            }            return new Result<>(ResultCode.SUCCESS,ResultCode.DOWN_FILE_SUCCESS);        }catch (Exception e){            e.printStackTrace();            return new Result<>(ResultCode.FAIL,ResultCode.DOWN_FILE_FAIL);        }    }

这里需要一个编写获取文件名的工具类,不然下载之后浏览器不知道文件类型

    public static String getFileName(String url) {        if(!url.equals("")){        return url.substring(url.lastIndexOf("/")+1);        }        else return "文件地址错误";    }

接口测试

发送请求完成下载

基于gitee如何实现上传下载文件的功能

文件删除接口

中间工具类

    public static void del(String url){        if (!url.equals("") && !url.contains("master/")) {            log.info("url:" + url + " 无法解析路径!");        }        String path = url.substring(url.indexOf("master/") + 7);        log.info("解析取得待删除路径:" + path);        String shaResult = GiteeImgBedUtil.getSha(path);        JSONObject jsonObj = JSONUtil.parseObj(shaResult);        String sha = jsonObj.getStr(GiteeConstant.RESULT_BODY_SHA);        //3、Gitee请求:发送删除请求        String JSONResult = GiteeImgBedUtil.deleteFile(path, sha);        jsonObj = JSONUtil.parseObj(JSONResult);        if (jsonObj.getObj(GiteeConstant.RESULT_BODY_COMMIT) == null) {            log.info("删除文件失败!");        }        log.info("文件路径为:" + path + " 删除成功!");    }

service

获取文件地址并删除数据库数据

    @Override    public String delFile(Long fileId) {        String url = fileMapper.selectById(fileId).getFilePath();        fileMapper.deleteById(fileId);        return url;    }

controller

**     * 删除文件接口     * @param fileId 前端传入的文件id     * @return     */    @GetMapping("/del")    public Result<String> delFile(Long fileId) {        try {            String url = fileService.delFile(fileId);            GiteeApi.del(url);            return new Result<>(ResultCode.SUCCESS,ResultCode.DEL_FILE_SUCCESS);        }        catch (Exception e){            e.printStackTrace();            return new Result<>(ResultCode.FAIL,ResultCode.DEL_FILE_FAIL);        }    }

接口测试

发送请求删除文件

基于gitee如何实现上传下载文件的功能

查看数据库和gitee仓库

基于gitee如何实现上传下载文件的功能

读到这里,这篇“基于gitee如何实现上传下载文件的功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 基于gitee如何实现上传下载文件的功能

本文链接: https://www.lsjlt.com/news/353366.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于gitee如何实现上传下载文件的功能
    本文小编为大家详细介绍“基于gitee如何实现上传下载文件的功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于gitee如何实现上传下载文件的功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方案的选择文件...
    99+
    2023-07-05
  • 基于Spring实现文件上传功能
    本小节你将建立一个可以接受HTTP multi-part 文件的服务。你将建立一个后台服务来接收文件以及前台页面来上传文件。要利用servlet容器上传文件,你要注册一个MultipartConfigElement类,以往需要在web.xm...
    99+
    2023-05-31
    spring 文件上传 实现文件
  • java实现文件上传下载功能
    本文实例为大家分享了java实现文件上传下载的具体代码,供大家参考,具体内容如下 1.上传单个文件 Controller控制层 import java.io.File; imp...
    99+
    2022-11-12
  • SpringMVC实现文件上传下载功能
    目录导入需要的依赖包一、单个文件上传二、多个文件上传三、上传文件列表显示四、文件下载今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current reque...
    99+
    2022-11-13
  • Java基于BIO实现文件上传功能
    本文实例为大家分享了Java基于BIO实现文件上传功能的具体代码,供大家参考,具体内容如下 客户端 package com.qst.file; import java.io.B...
    99+
    2022-11-12
  • Android基于OkHttp实现文件上传功能
    本文实例为大家分享了Android基于OkHttp实现文件上传的具体代码,供大家参考,具体内容如下 一、相关概述 Android请求访问服务端大多数情况下依旧是使用http协议,故而...
    99+
    2022-11-13
  • SpringBoot如何实现文件上传与下载功能
    今天小编给大家分享一下SpringBoot如何实现文件上传与下载功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Sprin...
    99+
    2023-07-02
  • Servlet如何实现文件的上传与下载功能
    这篇文章给大家分享的是有关Servlet如何实现文件的上传与下载功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现条件:需要一个form标签,method为post请求2、form的encType属性值为mu...
    99+
    2023-06-14
  • servlet实现文件上传与下载功能
    本文实例为大家分享了servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 内容 我们分两大模块来进行讲解,即上传的实现,与下载的实现 上传的实现 注意了我们在写上传表...
    99+
    2022-11-11
  • Vue实现文件上传和下载功能
    本文实例为大家分享了Vue实现文件上传和下载功能的具体代码,供大家参考,具体内容如下 1、a标签download属性 在H5中,为a标签新增了一个download属性,来直接文件的...
    99+
    2022-11-12
  • java实现ftp文件上传下载功能
    本文实例为大家分享了ftp实现文件上传下载的具体代码,供大家参考,具体内容如下package getUrlPic;import java.io.ByteArrayInputStream;import java.io.IOException;...
    99+
    2023-05-31
    ftp 上传 下载
  • 基于Vue3文件拖拽上传功能实现
    文件上成功能在我们的身边经常遇到,下面小编通过实例代码给大家分享实现方法,效果图如下所示: <template> <div :class="['drag'...
    99+
    2022-11-13
    vue3拖拽上传 vue文件拖拽上传
  • 基于SpringBoot上传任意文件功能的实现
    一、pom文件依赖的添加<dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...
    99+
    2023-05-31
    springboot 上传 任意文件
  • Retrofit+Rxjava如何实现文件上传和下载功能
    这篇文章主要介绍Retrofit+Rxjava如何实现文件上传和下载功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Retrofit简介:在Android API4.4之后,Google官方使用了square公司推...
    99+
    2023-05-30
    retrofit rxjava
  • Blob对象如何实现文件上传下载功能
    本篇内容介绍了“Blob对象如何实现文件上传下载功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是Blod?Blob 对象表示一个不可...
    99+
    2023-07-04
  • vue与django如何实现文件上传下载功能
    本篇内容主要讲解“vue与django如何实现文件上传下载功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue与django如何实现文件上传下载功能”吧!文件上传功能上传后端部分(一)Mod...
    99+
    2023-07-05
  • JavaWeb是如何实现文件上传和下载功能
    这篇文章将为大家详细讲解有关JavaWeb是如何实现文件上传和下载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 文件传输原理及介绍2. JavaWeb文件上传2.1我们用一个新的方...
    99+
    2023-06-22
  • SpringBoot实现文件上传下载功能小结
    最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。单文件上传// 单文件上传@RequestMapp...
    99+
    2023-05-31
    spring boot 文件上传
  • 基于nodejs+express(4.x+)实现文件上传功能
    Nodejs是一个年轻的编程框架,充满了活力和无限激情,一直都在保持着快速更新。基于Nodejs的官方Web开发库Express也在同步发展着,每年升级一个大版本,甚至对框架底层都做了大手术。在Expres...
    99+
    2022-06-04
    文件上传 功能 nodejs
  • Java基于BIO怎么实现文件上传功能
    这篇文章给大家介绍Java基于BIO怎么实现文件上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。客户端package com.qst.file;import java.io.BufferedI...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作