简介:在Java编程中,文件上传分为本地存储或云存储,这篇帖子小编将说明且用实例验证这两种文件上传的优缺点。
文件上传定义
- 文件上传,是指将本地的图片、视频、音频等文件上传到服务器,供其他用户浏览或者下载。
- 文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
文件上传目录
前端页面
文件上传需要前端页面的三要素:
- 前端页面的输入框: type 为 file
- 编码格式:enctype=“multipart/form-data”
- 提交方法:method=“post”
下面是前端页面代码(在IDEA项目中的static目录下)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像: <input type="file" name="image"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
<!--enctype="multipart/form-data-->
后端程序
后端程序只需要编写相对应的请求响应类,就能接收前端页面发来的数据,并且返回响应。
下面是后端程序对应的控制器类(在IDEA项目中),在下图的代码中用到了一个新的API,“MultipartFile image”,表达的意思是创建一个image变量,它是MultipartFile 类型(小编是这样说的,方便各位理解),它可以接受音频、视频、文件等数据格式。
package com.itheima.tliaswebmanagement.controller;
import com.itheima.tliaswebmanagement.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@RestController
@RequestMapping("/upload")
public class UploadController {
@PostMapping
public Result upload(String username, Integer age, @RequestParam("image") MultipartFile image){
log.info("文件上传: {}, {}, {}", username, age, image);
return Result.success();
}
}
文件存储
文件在上传到项目中后,会自动产生的要存储文件的对应的临时文件,当确认到存储后,临时文件会自动消失。这里文件的存储有两种,分别是:本地存储、云存储。
本地存储
在服务器端,接收到上传来的文件之后,将文件存储在本地服务器磁盘中,在存储时有两件事情要注意。
其一:就是要对每一个用户上传的文件进行新命名,这样才能保证不会出现上传文件重名出现的覆盖现象。(解决方案如下)
package com.itheima.tliaswebmanagement.controller;
import com.itheima.tliaswebmanagement.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Slf4j
@RestController
@RequestMapping("/upload")
public class UploadController {
@PostMapping
public Result upload(String username, Integer age, @RequestParam("image") MultipartFile image) throws Exception {
log.info("文件上传: {}, {}, {}", username, age, image);
// 获取原始文件名
String originalFilename = image.getOriginalFilename();
// 构建唯一的文件名称,防止新用户在上传文件的时候因为文件名重复,将老用户的文件覆盖掉
String uuid = UUID.randomUUID().toString();
int lastIndexOf = originalFilename.lastIndexOf(".");
String substring = originalFilename.substring(lastIndexOf);
String newFileName = uuid + substring;
// 将要上传的文件存储到指定位置,有异常产生,直接抛出。
image.transferTo(new File("D:\\temp\\" + newFileName));
return Result.success();
}
}
其二:就是修改上传文件大小限制,因为默认上传文件的大小为1M,但是实际情况中上传的文件大小不止1M,而且数量也不能确定。(解决方案如下)
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=qwer1234
#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true
#配置单个文件上传-文件最大容量 (开发者根据实际需求自己定义)
spring.servlet.multipart.max-file-size=10MB
#配置单个文件上传-文件最大容量 (一次请求,上传多个文件), (开发者根据实际需求自己定义)
spring.servlet.multipart.max-request-size=100MB
点评:本地存储的缺点很明显:1.存储在服务器磁盘中,前端页面无法直接访问。 2.服务器磁盘容量有限,扩容麻烦。 3.一单磁盘出现问题,项目将失效。
云存储
阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商,小编这边也是阿里云作为云存储讲解的。
如果读者是新用户,那你们需要先注册登录、实名认证和开通OSS服务的,具体操作流程,我这边给出一个PDF文档,读者自行点击下载(OSS服务—PDF文档)
在这里小编认为读者应该已经在阿里云官网找到了这个页面(如下图),按照图片所标记的顺序点击下去
之后按照下图执行下去。
因为我们是要上传文件,所以接下来我们点击Java上传文件,之后在这个代码中进行修改一些配置(代码中有详细的解释说明,这里不再叙述)。
总结
以上就是Java文件上传的全部内容了,若有什么不足之处,欢迎各位大佬斧正。
如果看官们觉得不错的话,请给个留言、点赞或者关注,你的支持就是我最大的动力。