SpringBoot上传文件到服务器

SpringBoot上传文件到服务器

一、客户端

1、定义上传文件信息封装类
public class UploadFileStatus {

    /*文件名字*/
    private String fileName;
    /*文件类型,包括img,video,html,preview_html等*/
    private String fileType;
    /*文件路径,用于提示文件服务器将文件存储到何种路径之下*/
    private String filePath;
    /*文件的输出流*/
    private FileInputStream inputStream;
    /*文件的大小*/
    private long fileSize;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFileType() {
        return fileType;
    }

    public void setFileType(String fileType) {
        this.fileType = fileType;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(FileInputStream inputStream) {
        this.inputStream = inputStream;
    }

    public long getFileSize() {
        return fileSize;
    }

    public void setFileSize(long fileSize) {
        this.fileSize = fileSize;
    }
}
2、上传文件工具类
/**
 * @Description: 用于发送各种Http请求的工具类
 */
public class HttpUtils {
  
    /**
     * @Description: 用于向静态资源服务器推送数据流(包括图片,视频等静态资源)
     * @param targetUrl 目标URL
     * @param status 上传的文件信息
     */
    // 发送post请求,获取String
    public static String postFile(String targetUrl, UploadFileStatus status) {

        try {
            URL url = new URL(targetUrl.trim());
            // 打开连接
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            // 设置允许输入输出
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            // 设置不用缓存
            urlConnection.setUseCaches(false);
            // 设置传递方式
            urlConnection.setRequestMethod("POST");
            // 设置维持长连接
            urlConnection.setRequestProperty("Connection", "keep-alive");
            // 设置字符集
            urlConnection.setRequestProperty("Charset", "UTF-8");
            // 设置文件长度和类型
            urlConnection.setRequestProperty("Content-Length", String.valueOf(status.getFileSize()));
            // 设置文件类型
            urlConnection.setRequestProperty("Content-Type", "application/x-form-urlencoded");
            
            // 设置传递的参数
            urlConnection.setRequestProperty("fileName", status.getFileName());
            urlConnection.setRequestProperty("fileType", status.getFileType());
            urlConnection.setRequestProperty("filePath", status.getFilePath());

            // 开始连接请求
            urlConnection.connect();
            OutputStream out = urlConnection.getOutputStream();
            // 获取上传文件的输入流
            InputStream fileIS = status.getInputStream();
            byte[] tempBytes = new byte[1024];
            int byteRead = 0;
            // 写入请求的字符串
            while((byteRead = fileIS.read(tempBytes)) != -1) {
                out.write(tempBytes, 0, byteRead);
            }

            out.flush();
            fileIS.close();
            out.close();
            //TODO
            System.out.println(status.getFileName() +"." + status.getFileType() + "的上传回复的code是:" + urlConnection.getResponseCode());
            // 请求返回的状态
            if (200 == urlConnection.getResponseCode()) {
                // 关闭数据流
                status.getInputStream().close();
                // 请求返回的数据
                InputStream in = urlConnection.getInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = 0;
                while (-1 != (len = in.read(buffer))) {
                    baos.write(buffer, 0, len);
                    baos.flush();
                }

                return baos.toString("utf-8");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }
        return "fail";
    }

}

二、服务器端

1、接收上传的文件,并且将上传的文件存储在指定路径下
@RestController
@RequestMapping(value = "/")
public class UploadFileController {

    /**
     * 接收上传的文件,并且将上传的文件存储在指定路径下
     * @param request
     * @return
     */
    @RequestMapping(value = "/upload")
    public String upload(HttpServletRequest request) {

        ServletInputStream sis = null;
        FileOutputStream fos = null;
        try {
            // 文件名
            String filename = request.getHeader("fileName");
            // 文件类型,例如:jpg、png、pdf...
            String fileType = request.getHeader("fileType");
            // 存储路径
            String filePath = request.getHeader("filePath");

            File file = new File(filePath+filename+"."+fileType);
            if(!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            if(!file.exists()) {
                file.createNewFile();
            }

            sis = request.getInputStream();
            fos = new FileOutputStream(file);
            byte[] content = new byte[1024];
            int len = 0;
            while((len=sis.read(content)) > -1) {
                fos.write(content, 0, len);
            }
            fos.flush();

            return "success";
        } catch (Exception ex) {
            ex.printStackTrace();

            return "fail";
        } finally {
            try {
                if(sis!=null) {
                    sis.close();
                }
                if(fos!=null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
2、设置静态资源映射
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {

    /**
     * 静态资源映射
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 当访问/file下的资源时,会到/root/myFile/下去找
        // 例如访问:http://localhost:8080/file/1.png时会去找/root/myFile/1.png
        registry.addResourceHandler("/file/**").addResourceLocations("file:/root/myFile/");
        super.addResourceHandlers(registry);
    }
}

三、测试

将服务端程序部署在192.168.79.115服务器上,然后在本地运行客户端程序,实现将本地文件上传到服务器上,然后可以在服务器上访问到上传的文件

测试代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class FileClientApplicationTests {

    @Test
    public void uploadFileTest() throws FileNotFoundException {

        // 要上传的文件
        File file = new File("E:/defalt-photo.png");
        UploadFileStatus fileStatus = new UploadFileStatus();
        // 上传到服务器后的文件名
        fileStatus.setFileName("test2");
        // 上传到服务器的哪个位置
        fileStatus.setFilePath("/root/myFile/");
        // 文件的大小
        fileStatus.setFileSize(file.length());
        // 文件的类型
        fileStatus.setFileType("png");
        fileStatus.setInputStream(new FileInputStream(file));

        String result = UploadFileUtil.uploadFile("http://192.168.79.115:8090/upload", fileStatus);
        System.out.println(result);
    }

}

在浏览器中访问:http://192.168.79.115:8090/file/test2.png,就可以看到刚刚上传的图片了,注意,需要关闭服务器的防火墙

你可能感兴趣的:(springboot)