Ruoyi框架学习--上传和下载

这篇博客详细介绍了在RuoYi框架中如何实现文件上传和下载。首先,前端提供按钮,用户选择文件后,前端会预检查文件类型。接着,文件上传到后端的`SysProfileController`中的核心方法。文件上传利用了`FileUploadUtils`工具类。对于下载,博主给出了参考代码和下载方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件上传--以上传个人头像为例子:

 文件上传下载实现流程:后台手册 | RuoYi

1、前端就是给了个按钮,点一下就开始文件上传了。但是在点击开始长传之前要通过前端对上传的文件的类型(因为照片都是jpg、png)的进行一个预先判断:

// 上传预处理
    beforeUpload(file) {
      if (file.type.indexOf("image/") == -1) {
        this.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
      } else {
        const reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = () => {
          this.options.img = reader.result;
        };
      }
    },

2、然后开始上传走到后端来,运行核心方法:com.ruoyi.web.controller.system.SysProfileController

 /**
     * 头像上传
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping("/avatar")
    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
    {
        if (!file.isEmpty())    //判断传过来的文件不能为空
        {
            LoginUser loginUser = getLoginUser();    //获取传过来的用户信息
            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);     //根据文件路径、文件内容、文件后缀名进行文件上传(核心)
            if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
            {
                AjaxResult ajax = AjaxResult.success();    //通过ajax发布成功消息
                ajax.put("imgUrl", avatar);      //使用ajax把路径和图片名称捆绑传输
               
                loginUser.getUser().setAvatar(avatar);    // 更新缓存中的用户头像
                tokenService.setLoginUser(loginUser);     // 设置token中的用户信息
                return ajax;
            }
        }
        return AjaxResult.error("上传图片异常,请联系管理员");
    }
}

3、其中牵扯到一个重要的文件上传方法:com.ruoyi.common.utils.file.FileUploadUtils下的

 /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param allowedExtension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException 比如读写文件出错时
     * @throws InvalidExtensionException 文件校验异常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
//设定文件名长度不能超过预设的最大长度
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
//判断上产文件类型是正确的
        assertAllowed(file, allowedExtension);
//对文件名进行二次编码避免重复
        String fileName = extractFilename(file);
//设定最终的文件路径
        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
        file.transferTo(Paths.get(absPath));
        return getPathFileName(baseDir, fileName);
    }

下载实现流程

1、参考示例代码。

function downloadFile(value){
	window.location.href = ctx + "common/download/resource?resource=" + value;
}

2、参考Controller下载方法

/**
 * 本地资源通用下载
 */
@GetMapping("/common/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
		throws Exception
{
	// 本地资源路径
	String localPath = Global.getProfile();
	// 数据库资源地址
	String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
	// 下载名称
	String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
	response.setCharacterEncoding("utf-8");
	response.setContentType("multipart/form-data");
	response.setHeader("Content-Disposition",
			"attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName));
	FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
### 若依框架中实现跨系统数据推送的具体方法 若依(RuoYi)是一款基于Spring BootSpring Cloud的开源快速开发平台,提供了丰富的模块化设计扩展能力。在实际应用中,可以利用若依框架的强大功能来实现跨系统之间的数据推送。 以下是几种常见的实现方式及其最佳实践: #### 1. **基于消息队列的数据推送** 利用Kafka、RabbitMQ等消息中间件作为桥梁,在生产者端将数据推送到指定的主题或队列,消费者端订阅该主题或队列并接收数据[^1]。 ```java @Service public class DataProducer { private final KafkaTemplate<String, String> kafkaTemplate; public DataProducer(KafkaTemplate<String, String> kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } public void sendData(String topic, String data) { kafkaTemplate.send(topic, data); } } ``` 在目标系统中配置对应的消费者服务即可完成数据消费。 #### 2. **HTTP接口调用** 借助RestTemplate或者WebClient发起HTTP请求,将数据以JSON或其他格式传递给目标系统[^3]。 ```java @Component public class HttpClientUtil { RestTemplate restTemplate = new RestTemplate(); public ResponseEntity<String> postData(String url, Object requestObject) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<Object> entity = new HttpEntity<>(requestObject, headers); return restTemplate.exchange(url, HttpMethod.POST, entity, String.class); } } ``` #### 3. **文件传输协议 (FTP/SFTP)** 对于批量数据推送场景,可以通过SFTP上传文件到远程服务器供对方下载解析[^2]。 ```java JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession(username, host, port); session.setPassword(password); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); channelSftp.put(localFilePath, remoteDirectoryPath); // Upload file } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } finally { if (session != null && session.isConnected()) { session.disconnect(); } } ``` #### 4. **数据库同步** 如果两个系统共享同一套数据库,则可以直接操作表记录;否则可通过定时任务抓取增量更新部分写入另一方数据库。 --- ### 总结 以上四种方案各有优劣,需根据实际情况选择合适的手段实施跨系统间的数据交互过程。其中消息队列适合实时性强的应用场合;而RESTful API则更倾向于轻量化微服务架构下点对点通讯需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值