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日

相关文章

  • JavaEE Spring MyBatis如何一步一步实现数据库查询功能

    一、概述JavaEE 是一个企业级应用开发框架,Spring 是 JavaEE 中最常用的框架之一,MyBatis 是一款优秀的 ORM 框架,通过使用这三个框架,可以轻松实现一个 JavaEE 企业级应用。本文将以一个简单的文章阅读网站为例,介绍 JavaEE Spring MyBatis 如何一步一步实现数据库查询功能。 二、环境准备1. JDK 1.8…

    Java 2023年5月31日
    00
  • Spring零基础到进阶之使用方法详解

    Spring零基础到进阶之使用方法详解 什么是Spring Spring 是一个开放源代码的设计层面框架,它解决的是业务层和其他各层的耦合问题,使得整个系统架构清晰、易于维护、扩展性强。 Spring框架的模块 Spring框架分为20多个模块,其中最常用的是Core Container、Data Access/Integration、Web、AOP,下面分…

    Java 2023年5月19日
    00
  • java socket实现聊天室 java实现多人聊天功能

    下面为您详细讲解 Java Socket 实现聊天室的完整攻略。 一、概述 Java Socket 是 Java 语言提供的一种基于网络通信的 API,它可以实现两台或多台计算机之间的数据交换。聊天室是一种基于网络通信的应用程序,Java Socket 可以通过编写网络通信代码来实现聊天室功能。 二、实现步骤 1. 创建 Socket 服务器 首先需要创建一…

    Java 2023年5月24日
    00
  • nginx配置proxy_pass中url末尾带/与不带/的区别详解

    下面是关于nginx配置proxy_pass中url末尾带/与不带/的区别的详细攻略: 1.问题背景 在nginx配置代理(proxy_pass)时,url末尾带/与不带/有什么区别?在哪种情况下该使用哪种方式呢?本篇攻略将针对这一问题做详细的解答。 2.区别详解 2.1 url末尾带/ 当使用url末尾带/的方式,如下所示: location /abc/ …

    Java 2023年6月15日
    00
  • Java 中的变量类型

    Java 中的变量类型 Java 是一种强类型语言,也就是说每个变量在声明时都必须指定一个明确的数据类型。Java 支持以下八种基本数据类型: 整型 byte: 字节型,占用 1 个字节,取值范围为 -128 到 +127。 short: 短整型,占用 2 个字节,取值范围为 -32768 到 +32767。 int: 整型,占用 4 个字节,取值范围为 -…

    Java 2023年5月26日
    00
  • Spring 异常单元测试的解决

    对于“Spring 异常单元测试的解决”的完整攻略,可以分为以下几个步骤来进行讲解。 步骤一:添加必要的依赖 在开始进行 Spring 异常单元测试前,需要在项目文件中添加必要的依赖。这里我们需要添加 JUnit 和 Spring Test 的依赖。 <dependency> <groupId>org.junit.jupiter&lt…

    Java 2023年5月27日
    00
  • 微信小程序支付及退款流程详解

    微信小程序支付及退款流程详解 支付流程 1. 获取openid 在发起支付前,需要获取用户的openid。可以通过调用微信官方提供的登录接口wx.login(),在获取到临时登录凭证code后,再通过调用wx.request()接口向服务器发送请求,从而获取用户的openid。 示例代码: wx.login({ success: function(res) …

    Java 2023年5月23日
    00
  • SpringBoot使用自定义json解析器的使用方法

    下面是SpringBoot使用自定义JSON解析器的使用方法攻略。 前置知识 熟悉SpringBoot。 了解Jackson JSON库。 自定义JSON解析器的使用方法 自定义JSON解析器 SpringBoot默认使用Jackson作为JSON库,我们可以通过继承Jackson的ObjectMapper类来自定义JSON解析器。 示例代码如下: impo…

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