文件上传的多种方式

这次说一下文件上传,文件上传用的还是很多的,比如后台系统上传产品图片,用户头像等等,我们经常用的有将图片或者文件上传到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. 用到了再来更新

posted @ 2020-04-26 18:41  范特西-  阅读(527)  评论(0)    收藏  举报