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

yizhihongxing

下面将详细讲解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日

相关文章

  • 一文带你搞懂Java8的LocalDateTime

    一文带你搞懂Java8的LocalDateTime 什么是LocalDateTime LocalDateTime是Java 8提供的一个时间类型,表示本地日期和时间,不包含时区信息。它是LocalDate和LocalTime的结合体,提供了更加方便的操作方式和更加清晰的概念。 获取LocalDateTime实例 使用LocalDateTime.now()方法…

    Java 2023年5月20日
    00
  • 看动画学算法之Java实现doublyLinkedList

    看动画学算法是一种十分有趣的学习方式,Java实现doublyLinkedList正好可以通过该方法进行学习。下面是实现doublyLinkedList的完整攻略。 准备工作 在进行doublyLinkedList的实现之前,需要进行如下准备工作: 确认Java编译器、JUnit测试框架和Maven构建工具是否已经安装好。 创建一个新的Java项目并在其中添…

    Java 2023年5月19日
    00
  • eclipse怎么批量修改java文件编码?

    下面我将详细讲解“eclipse怎么批量修改java文件编码”的攻略,包括两条示例说明。 首先,为了批量修改java文件编码,我们需要在eclipse中安装一个插件,这个插件叫做”CpDetector”。这个插件能够帮助我们自动检测和转换文件编码,非常方便。 安装插件的步骤如下: 1.打开eclipse,点击”Help” -> “Eclipse Mar…

    Java 2023年5月31日
    00
  • 别了Java EE! 正式更名为Jakarta

    针对Java EE正式更名为Jakarta的问题,我会进行详细的讲解,包括以下几点: 1. 背景 在2017年8月,Oracle公司宣布将 Java Enterprise Edition(EE)的所有商标和相关的Java EE规范文档转移到Eclipse基金会。在经过一段时间的讨论、咨询和协作后,Java EE正式在2018年9月转交给了 Eclipse 基…

    Java 2023年5月19日
    00
  • Maven配置单仓库与多仓库的实现(Nexus)

    Maven是一款开源的Java项目管理工具,它可以自动化地构建、发布和管理Java项目。在使用Maven构建Java项目时,需要配置仓库来管理项目依赖的库。一般来说,Maven支持单仓库和多仓库两种配置方式。 单仓库配置 单仓库配置即使用一个仓库来管理Java项目依赖的库。在Maven的配置文件pom.xml中,可以使用如下代码块来配置单仓库。 <re…

    Java 2023年5月19日
    00
  • maven assembly打包生成Java应用启动脚本bat和sh的方法

    Maven是一个流行的Java项目管理和构建工具,它可以自动处理依赖关系和构建过程。 Maven Assembly插件提供了将Java应用程序打包成一个可执行的JAR文件并创建用于启动应用程序的脚本的功能。本教程将介绍如何使用Maven Assembly插件打包Java应用程序并生成启动脚本。 安装Maven 首先,您需要安装Maven。您可以从Maven官…

    Java 2023年6月2日
    00
  • Spring MVC官方文档学习笔记(一)之Web入门

    注: 该章节主要为原创内容,为后续的Spring MVC内容做一个先行铺垫 1.Servlet的构建使用 (1) 选择Maven -> webapp来构建一个web应用 (2) 构建好后,打开pom.xml文件,一要注意打包方式为war包,二导入servlet依赖,如下 <!– 打war包 –> <packaging>war…

    Java 2023年5月11日
    00
  • jsp hibernate 数据保存操作的原理

    JSP是Java Web应用中常用的视图层技术,而Hibernate则是Java编程语言中非常流行的ORM框架。这两种技术结合使用可以方便、快速地实现Web应用中的数据持久化操作。 在开发中,我们通常需要涉及到实例化Hibernate SessionFactory,并设置相关数据源连接池与映射文件路径等参数;创建Hibernate映射文件、实体对象类以及相关…

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