文件上传的多种方式
这次说一下文件上传,文件上传用的还是很多的,比如后台系统上传产品图片,用户头像等等,我们经常用的有将图片或者文件上传到tomcat服务器,或者是上传到FTP服务器,又或者是上传到云,比如阿里云OSS,七牛云 ,那接下来就看一下都怎么实现吧
Servlet上传
先回顾一下刚开始学Servlet怎么上传文件的吧
@MultipartConfig//该注解必须添加,辅助Part支持文件上传
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用于接受来自multipart/form-data的POST的请求。
Part part = req.getPart("file");
//获取文件名
String header = part.getHeader("content-disposition");
String path = header.substring(header.indexOf("filename=") + 10, header.length() - 1);
//文件存放目录,一般是每个用户一个文件,避免上传的文件名重复而覆盖掉
String realPath = req.getServletContext().getRealPath("/upload/folder" );
File file = new File(realPath);
if (!file.exists()) {
file.mkdirs();
}
//对拷流
InputStream inputStream = part.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(file, path)));
byte[] b = new byte[1024];
int len = 0;
while ((len = bis.read(b)) != -1) {
bos.write(b,0,len);
}
bos.close();
}
}
SpringMVC上传
SpringMVC帮我们将文件封装到了MultipartFile中,后端接收将它作为就可以获取到文件的属性,并且可以调用它的transferTo方法上传
基于commons-fileupload实现的,所以要导入它的依赖
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
在spring-mvc.xml中进行配置
<!--文件上传配置-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 上传文件大小上限,单位为字节(10485760=10M) -->
<property name="maxUploadSize" value="10485760"/>
<property name="maxInMemorySize" value="40960"/>
</bean>
@Controller
public class FileController {
/*
* 采用file.Transto 来保存上传的文件
*/
@RequestMapping("/upload")
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//上传路径保存设置
String path = request.getServletContext().getRealPath("/upload");
File fileDir = new File(path);
if (!fileDir.exists()){
//写的权限
filelDir.setWritable(true);
fileDir.mkdir();
}
//上传文件地址
System.out.println("上传文件保存地址:"+realPath);
File targetFile = new File(realPath +"/"+ file.getOriginalFilename());
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
file.transferTo(targetFile);
return targetFile.getName();
}
}
阿里云OSS
这种方式公司用的还是比较多的,不需要去维护
具体的阿里云控制台操作我就不说怎么创建了,可以百度一下
导入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
进行配置,我这里使用的Spring,所以在xml文件配置了,如果用的SpringBoot可以在类里配置
<!--阿里云OSS配置 通过构造函数注入属性-->
<bean id="ossClient" class="com.aliyun.oss.OSSClient">
<!--地域节点-->
<constructor-arg index="0" value="oss-cn-shanghai.aliyuncs.com"></constructor-arg>
<!--密钥 AccessKey ID和AccessKey Secret-->
<constructor-arg index="1" value="***"></constructor-arg>
<constructor-arg index="2" value="***"></constructor-arg>
</bean>
开始上传
@Autowired
OSSClient ossClient;
/**
* folder:bucket的文件目录
*/
@RequestMapping("/upload")
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, String folder) throws IOException {
//阿里云创建时的bucket名字
String bucketName = "bucketname";
//uuid 保证图片唯一,避免重名被覆盖掉
String fileName = "";
if (StringUtils.isNotBlank(folder)) {
fileName = folder + "/" + UUID.randomUUID() + file.getOriginalFilename();
} else {
fileName = UUID.randomUUID() + file.getOriginalFilename();;
}
try {
//上传 1.存储空间 2.文件名 3.文件流
ossClient.putObject(bucketName, fileName, file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
//返回路径 阿里云oss默认路径 https://bucket名字+.oss-cn-区域.aliyuncs.com/+文件名
return "https://" + bucketName + ".oss-cn-shanghai.aliyuncs.com/" + fileName;
}
七牛云
Todo. 用到了再来更新

浙公网安备 33010602011771号