Java文件上传与文件下载实现方法详解

下面将详细讲解Java文件上传与文件下载实现方法详解,分为以下几个方面:

  1. 文件上传

文件上传通常需要以下几个步骤:

  • 创建一个表单,允许用户选择要上传的文件;
  • 通过后端编写的处理程序处理上传的文件;
  • 将文件保存到服务器的指定位置。

下面使用Spring Boot框架和Thymeleaf模板实现文件上传。

首先,在Spring Boot中,我们需要添加Multipart处理器,该处理器可以帮助我们处理上传的文件:

@Configuration
public class AppConfig {
    @Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
    }
}

然后,创建一个表单,使用户能够选择要上传的文件:

<form method="post" action="#" th:action="@{/upload}"
      enctype="multipart/form-data">
    <div class="form-group">
        <label for="file">选择要上传的文件:</label>
        <input type="file" name="file" id="file">
    </div>
    <button type="submit" class="btn btn-primary">上传</button>
</form>

在上面的表单中,我们使用enctype="multipart/form-data"属性来告诉浏览器上传的是文件,而不是普通的表单数据。

接下来,我们需要编写一个Controller来处理上传的文件:

@Controller
public class FileUploadController {
    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file,
                                   RedirectAttributes redirectAttributes) {
        String filename = StringUtils.cleanPath(file.getOriginalFilename());

        try {
            Path fileStorageLocation = Paths.get("uploads")
                    .toAbsolutePath().normalize();
            Files.createDirectories(fileStorageLocation);

            Path targetLocation = fileStorageLocation.resolve(filename);
            Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);

            redirectAttributes.addFlashAttribute("message",
                    "File " + filename + " uploaded successfully!");
        } catch (Exception ex) {
            redirectAttributes.addFlashAttribute("message", ex.getMessage());
        }
        return "redirect:/";
    }
}

在上面的Controller中,我们使用@PostMapping注解来指定POST请求的URL,也就是接收表单数据的URL。@RequestParam("file")表示接收名为file的文件数据。

在处理Controller中,首先通过StringUtils.cleanPath(file.getOriginalFilename())获取上传的文件名,并清理掉所有不允许的路径字符,以防止路径遍历攻击。

然后,我们使用Paths.get("uploads").toAbsolutePath().normalize()获取要保存文件的目录,并按照我们的要求创建它。最后,我们将上传的文件保存到该目录下,并返回一个消息,告诉用户文件已经上传成功。

另外一个示例中,我们可以使用HttpClient模拟上传文件:

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://localhost:8080/upload");

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", new File("path/to/file"), ContentType.APPLICATION_OCTET_STREAM, "filename");
HttpEntity entity = builder.build();
httpPost.setEntity(entity);

CloseableHttpResponse response = httpClient.execute(httpPost);

在上面的示例中,我们创建了一个HttpPost对象,并将它们上传到指定的URL。我们使用MultipartEntityBuilder类创建一个Multipart对象,并将要上传的文件添加到里面。然后我们将该对象传递给HttpPost请求,HttpClient会负责转换为HTTP请求,并将其发送到服务器。

  1. 文件下载

文件下载通常需要以下几个步骤:

  • 根据文件名从指定位置读取文件;
  • 将文件转换为字节数组;
  • 将字节数组写入到HTTP响应体中。

下面使用Spring Boot框架和Thymeleaf模板实现文件下载。

首先,在Spring Boot中,我们需要添加MIME类型映射,以便识别我们要下载的文件类型:

@Configuration
public class AppConfig {
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/uploads/**")
                        .addResourceLocations("file:/path/to/uploads/")
                        .setCachePeriod(0);
            }

            @Override
            public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
                configurer.defaultContentType(MediaType.APPLICATION_OCTET_STREAM);
            }
        };
    }
}

然后,我们需要编写一个Controller来处理下载的请求:

@Controller
public class FileDownloadController {
    @GetMapping("/download/{fileName:.+}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request) {
        Resource resource = new FileSystemResource("path/to/uploads/" + fileName);

        String contentType = null;
        try {
            contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        if(contentType == null) {
            contentType = "application/octet-stream";
        }

        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(contentType))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }
}

在上面的Controller中,我们使用@GetMapping注解来指定GET请求的URL,也就是请求下载文件的URL。@PathVariable表示文件名是一个路径变量,.+表示路径变量可以匹配带有扩展名的文件名。

在处理Controller中,我们首先从指定位置读取文件,并将其转换为Resource对象,以便让Spring MVC处理并输出到响应体中。然后我们从请求中获取文件的MIME类型,并设置到响应头中。最后,我们使用ResponseEntity对象将文件的字节数组转换为HTTP响应体,并告诉浏览器文件应该被下载(而不是在浏览器中打开)。

另外一个示例中,我们可以使用HttpClient模拟下载文件:

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://localhost:8080/download/filename");

CloseableHttpResponse response = httpClient.execute(httpGet);

HttpEntity entity = response.getEntity();
if (entity != null) {
    InputStream inputStream = entity.getContent();
    OutputStream outputStream = new FileOutputStream(new File("path/to/save/file"));

    byte[] buffer = new byte[1024];
    int len;
    while ((len = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, len);
    }

    outputStream.close();
    inputStream.close();
}

在上面的示例中,我们创建了一个HttpGet对象,并将它们下载到指定的URL。HttpClient会负责将服务器的响应转换为HttpEntity对象,我们可以调用getContent()方法获得该实体的内容。最后,通过输入流把实体内容保存到本地文件中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java文件上传与文件下载实现方法详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 深入解读MVC模式和三层架构

    深入解读MVC模式和三层架构攻略 1. 什么是MVC模式 MVC模式是一种软件架构模式,其主要目的是将应用程序分成三个独立的组件:Model,View和Controller。每个组件职责分工明确,便于进行维护和升级。 ModelModel是一个独立的组件,它是应用程序的基础数据和业务规则的主要表示形式。它负责与数据库进行交互,保存数据和业务逻辑。 ViewV…

    Java 2023年6月15日
    00
  • 解决spring data jpa 批量保存更新的问题

    当我们要批量插入或更新数据时,使用Spring Data JPA的saveAll()方法可能会出现性能问题。 原因是saveAll()内部是将数据一条一条插入或更新到数据库,这样会导致插入或更新的性能较低,尤其在数据量较大的情况下。 为了解决这个问题,我们可以使用以下两种方式: 方式一:批量插入或更新实例列表 使用批量插入或更新实例列表的方法可以提高性能,不…

    Java 2023年5月20日
    00
  • SpringBoot Validation提示信息国际化配置方式

    以下是“SpringBoot Validation提示信息国际化配置方式”的完整攻略。 1. 添加依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • Spring Boot与Spring MVC Spring对比及核心概念

    下面是关于“Spring Boot与Spring MVC Spring对比及核心概念”的完整攻略。 Spring Framework简介 Spring Framework是一个全栈的Java框架,它为企业级应用程序提供了一个全面的编程和配置模型。它包括许多独立的模块,可以根据需要选择使用。一些最常用的模块是Spring Core容器、Spring MVC W…

    Java 2023年5月16日
    00
  • Spring MVC+FastJson+Swagger集成的完整实例教程

    Spring MVC+FastJson+Swagger集成的完整实例教程 Spring MVC是一个非常流行的Java Web框架,它提供了很多方便的功能。FastJson是一个高性能的JSON库,它可以将Java对象转换为JSON格式的字符串。Swagger是一个API文档生成工具,它可以自动生成API文档,并提供交互式API测试界面。本文将详细讲解如何使…

    Java 2023年5月17日
    00
  • 基于java语言实现快递系统

    为了实现一个基于Java语言的快递系统,我们需要采取以下步骤: 第一步:需求分析 首先,我们需要对开发的快递系统进行需求分析,确定系统的基本功能和特性。这一步需要和客户或用户沟通,收集需求并进行分析,以确保快递系统能够满足用户期望并达到预期效果。 第二步:设计系统架构 在确定了快递系统的需求之后,我们需要对系统进行设计,确定系统的结构和运行机制。针对一些功能…

    Java 2023年5月18日
    00
  • 详解SpringBoot定制@ResponseBody注解返回的Json格式

    接下来我将详细讲解“详解SpringBoot定制@ResponseBody注解返回的Json格式”的完整攻略。本攻略主要包括以下内容: 什么是@ResponseBody注解 @ResponseBody注解返回的默认Json格式 定制@ResponseBody注解返回的Json格式 1. 什么是@ResponseBody注解 @ResponseBody注解是S…

    Java 2023年5月26日
    00
  • 基于Spring中的线程池和定时任务功能解析

    我们来详细讲解一下“基于Spring中的线程池和定时任务功能解析”这个主题。 1. 线程池功能解析 1.1 Spring线程池概述 Spring提供了集成整个JDK标准线程池的功能,使我们可以方便地进行线程池的配置和使用。 在Spring中配置线程池,需要配置以下三个部分: TaskExecutor:Spring中的任务执行器,定义了多种任务和操作。 Thr…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部