文件(图片)上传下载

版权声明:本文为博主原创文章,如需转载请附上原文链接。 https://blog.csdn.net/Hi_Boy_/article/details/80525071

需要的jar包:commons-fileupload1.3.jar和commons-io2.6.jar

jar包maven配置方式

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

上传文件:

1.controller层写一个fileUpload()方法用来接收前端传过来的图片

@RequestMapping(value = "upload",method = RequestMethod.POST )
public AppResult fileUpload(MultipartFile file){

    try {
        ar = userService.uploadFile(dto,ar);
        return ar;
    }catch (Exception e){
        e.printStackTrace();
    }

注意:参数用MultipartFile 类型来接收,请求方式必须为POST

2.service层用UUID给上传的文件起名字并调用FileUtil类的uploadFileByFilename()方法上传文件

 
 
public String uploadFile(MultipartFile file) {
    
        //上传文件
        String aratarUrl = "";
        try {
            if (file != null && !file.isEmpty()) {
                String fileName = UUID.randomUUID().toString().trim();
                aratarUrl = FileUtil.uploadFileByFilename(file,fileName);
            }
        }catch (Exception e){
           e.printStackTrace();
        }
}

3.FileUtil工具类中

 
 
/**
 * 文件请求地址
 */
private static final String SERVER_ADDRESS = download/pic?fileName=;
      
/**
 * 文件存储地址
 */
private static final String FILE_ADDRESS = F:/PIC/;

 
 
public static String uploadFileByFilename(MultipartFile file , String name)
      throws IOException {
   //获得上传时的文件原名
 String fileName = file.getOriginalFilename();
   //从文件名中截取后缀名已获得文件类型
 String fileType=fileName.substring(fileName.lastIndexOf('.')+1,fileName.length());
   return getAnduploadFilename(file.getBytes(), fileType,name );
}
public static String getAnduploadFilename(byte[] bytes,String fileType,String name)
      throws IOException {
   File fa = new File(FILE_ADDRESS);
   //判断是否存在该文件如果不存在则创建该文件
   if(!fa.exists()){
      fa.mkdirs();
   }
   //文件全路径名
   String fullName =FILE_ADDRESS + name + "." + fileType;
   //从服务器下载该文件的url地址
   String serverName = SERVER_ADDRESS + name + "." + fileType;
   File file = new File(fullName);
   //用 org.apache.commons.io包中FileUtils类的writeByteArrayToFile()方法
   //将文件写入到服务器地址(SERVER_ADDRESS)对应的位置
   FileUtils.writeByteArrayToFile(file, bytes);
   return serverName;
}
至此文件上传成功 文件已保存到 FILE_ADDRESS 对应的文件夹下


下载文件:

1.controller层中写一个文件下载controller
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author [email protected]
 * @date 2018/5/31 13:27
 */
@RestController
@RequestMapping("download")
public class DownloadFileController {
    @RequestMapping(value = "pic",method = RequestMethod.GET)
    public void downloadPic(HttpServletResponse response,
                             String fileName){
        FileInputStream fis = null;
        OutputStream out = null;
        try {
            //设置响应格式
            response.setContentType("image/gif");
            //到FileUtil工具类中加载文件
            File file = FileUtil.downloadFile(fileName);
            //获得response的输出流
            out = response.getOutputStream();
            fis = new FileInputStream(file);
            byte[] b = new byte[fis.available()];
            //读取文件并写入到response响应中
            fis.read(b);
            out.write(b);
            out.flush();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (fis != null)
                    fis.close();
                if (out != null)
                    out.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}
2.FileUtil中downloadFile(fileName)方法如下
/**
 * 下载文件
 * @param fileName
 * @return
 */
public static File downloadFile(String fileName){
   return new File(FILE_ADDRESS + fileName);
}
至此文件下载也编写完成;
实质上文件上传和下载都是通过IO流来读写文件。
文件上传可以理解为从客户端读文件然后写到服务器的指定文件夹。

    文件下载可以理解为从服务器读文件然后写到客户端的指定文件夹。


注意:文件上传下载是http请求的content-type要设置为multipart/form-data类型,请求方式为POST方式

 最后一步:设置multipart类型的解析器

springMVC框架设置方法

在SpringMVC的配置文件中加入如下配置

<!-- 配置多媒体文件解析器 -->
<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为5MB --> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>

springBoot框架设置方法 :服务启动类中加上如下方法

//显示声明CommonsMultipartResolver为mutipartResolver
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setDefaultEncoding("UTF-8");
    //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
    resolver.setResolveLazily(true);
    resolver.setMaxInMemorySize(40960);
    resolver.setMaxUploadSize(5 * 1024 * 1024);//上传文件大小 5M 5*1024*1024
    return resolver;
}
类名上方加上如下注解
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
 
 

说明:文件上传时的 SERVER_ADDRESS 文件下载时的url地址

 
 

猜你喜欢

转载自blog.csdn.net/Hi_Boy_/article/details/80525071