spring mvc 二进制文件上传

本文介绍了一种前端实现的二进制文件上传方法,包括处理文件流、生成唯一文件名、保存文件到服务器及数据库记录等步骤。
/**
     * 二进制文件上传(前端)
     *
     * @param multipartFile MultipartFile上传文件的二进制流
     * @return fileUploadMap
     * @see org.springframework.web.multipart.MultipartFile
     */
    public Map<String, String> getFileUpload(MultipartFile multipartFile, String name, String uuid, String type,HttpServletResponse response) {

//        MultipartResolver resolver = new CommonsMultipartResolver(httpServletRequest.getSession().getServletContext());
//        MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(httpServletRequest);
//        List<MultipartFile> multipartFiles = multipartRequest.getFiles("file");

        Map<String, String> fileUploadMap = new HashMap<String, String>();
        //  for (MultipartFile multipartFile : multipartFiles) {
        //获取文件流
        InputStream fileInputStream = null;
        try {
            fileInputStream = multipartFile.getInputStream();
            if (null == fileInputStream) {
            }
        } catch (Exception e) {
            this.setError("上传文件:", "获取文件流", e.getMessage());
            //
        }

        //获取uuid作为新的文件名称
        String newFileName = UUID.randomUUID().toString();
        String dotExtensionName = StringUtil.getDotExtensionName(multipartFile.getOriginalFilename());

        //如果有以点开始的正常的文件扩展名,则将文件扩展名附加进来
        //如果不存在以点开始的正常的文件扩展名,则直接使用uuid,不附加扩
        //展名的方式保存文件
        if (dotExtensionName != null) {
            newFileName += dotExtensionName;
        }
        //写文件
        File newFile = FileUtil.createUploadDirectoryAndFile(newFileName);
        if (newFile == null) {
            this.setError("文件名:" + newFile.getPath(), "创建", "失败");
            return null;
        }
        this.setInfo("文件名:" + newFile.getPath(), "创建", "成功");

        try {
            //将来自InputSteam中的流复制到目标路径下,如果不存在会自动创建,如果存在则会覆盖,然后关闭流。(也有不关闭流的方法,自己查)
            FileUtils.copyInputStreamToFile(fileInputStream, newFile);
            this.setInfo("文件名:" + newFile.getPath(), "写入", "成功");
        } catch (IOException e) {
            this.setError("文件名:" + newFile.getPath(), "写入", e.getMessage());
            return null;
        }
        //判断是否存在关联关系
        if ((uuid != null) && (!"".equals(uuid))) {
            try {
                AttachmentInfoModel attachmentInfoModel;
                attachmentInfoModel = saveAttachmentInfo(newFileName, name, uuid, type);
                if (attachmentInfoModel.attachmentInfoEntity == null) {
                    this.setError("存储数据库失败", "写入", "失败");
                    return null;
                }
            } catch (Exception e) {
                this.setError("保存数据库失败", "写入", "失败");
                e.printStackTrace();
                return null;
            }
        }
        //此处为返给前台的url路径,用来访问文件,并存取到数据库当中
        String fileUrl = ProjectUtil.getInstance().getSystemInfo().getAttachmentHost() + "/" + newFileName;
        this.setInfo("文件访问路径:" + fileUrl, "生成", "成功");
        fileUploadMap.put("fileUrl", fileUrl);
        //  }
        return fileUploadMap;
    }
/**
     * 获取文件名扩展名不包含点
     *
     * @param fileName 包含扩展名的文件名称
     * @return String 成功返回文件扩展名,失败返回null
     */
    public static String getExtensionName(String fileName) {
        int lastDotIndex = 0;
        String extensionName = null;
        if (fileName == null) {
            return null;
        }
        if (fileName.length() == 0) {
            return null;
        }
        lastDotIndex = fileName.lastIndexOf('.');
        //如果文件名当中没有.的话返回null
        if (lastDotIndex == -1) {
            return null;
        }
        //如果.是整个文件名的最后一个则不再能正确认识扩展名
        if (lastDotIndex == fileName.length()) {
            return null;
        }
        //得到文件扩展名不包含点
        extensionName = fileName.substring(lastDotIndex + 1);
        return extensionName;
    }
/**
     * 获取文件名扩展名包含点
     *
     * @param fileName 包含扩展名的文件名称
     * @return String 成功返回文件扩展名,失败返回null
     */
    public static String getDotExtensionName(String fileName) {
        String extensionName = null;
        String dotExtensionName = null;
        extensionName = getExtensionName(fileName);
        if (extensionName == null) {
            return null;
        }
        dotExtensionName = "." + extensionName;
        return dotExtensionName;
    }

 

### 回答1: Spring 返回二进制文件流是指在使用Spring框架进行web开发时,通过编写控制器代码实现向前端传输一个文件的二进制流数据。 在Spring框架中,可以使用ResourceLoader接口来获取文件资源,并将其转化为文件流。在控制器中可以定义一个方法来处理请求,该方法可以通过注解的方式接收文件资源路径,然后使用ResourceLoader接口加载资源,读取二进制文件流并将其写入response的输出流中,使其发送到客户端。 例如,在使用Spring MVC框架处理文件上传时,可以通过编写一个注解为@PostMapping的控制器方法,方法中通过注入 ResourceLoader接口实现文件读取、文件写出等操作,然后将处理好的文件流返回给客户端。 总之,Spring框架支持基于注解的控制器编程模型,通过这种方式,我们可以很方便地实现文件传输功能,并且可以确保数据传输的高效、安全和可靠性。 ### 回答2: Spring返回二进制文件流,可以通过使用Spring的FileCopyUtils工具类来实现。FileCopyUtils具有复制输入流到输出流、将输入流转换为字节数组以及将字节数组转换为输出流等功能。这个类提供了方便的方法来读取和写入文件,而且可以处理大量的数据。 在Spring MVC中,如果需要返回二进制文件流,可以使用@ResponseBody注解将byte[]类型的数据返回给客户端。例如,一个简单的Controller方法可以返回一个jpg图片文件的二进制流: ``` @RequestMapping(value = "/image/{id}", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) @ResponseBody public byte[] getImage(@PathVariable("id") String id) throws IOException { // 读取图片文件 File file = new File("/path/to/image/" + id + ".jpg"); FileInputStream input = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; input.read(bytes); input.close(); return bytes; } ``` 这个方法接收id作为参数,并将图像文件读入byte[]数组中,最终将byte[]数组返回给客户端。在@RequestMapping注解中,使用produces属性指定了响应的媒体类型为image/jpeg,告诉浏览器返回的是JPG格式的图片。使用@ResponseBody注解标记该方法将以字节形式返回响应内容。 总之,Spring框架提供了丰富的工具类和注解,可以方便地实现返回二进制文件流的功能。无论是返回图片、PDF文件等任何类型的文件,只要按照指定格式读取,并将二进制流返回给客户端即可。 ### 回答3: Spring框架提供了多种方式返回二进制文件流,比如使用ResponseEntity和StreamingResponseBody等。 ResponseEntity可以用于直接返回字节数组或InputStream等二进制数据,同时还可以设置响应头信息,比如文件名、Content-Type等。示例代码如下: ``` @GetMapping("/download") public ResponseEntity<byte[]> downloadFile() throws IOException { File file = new File("path/to/file"); byte[] bytes = Files.readAllBytes(file.toPath()); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=file.jpg"); headers.add(HttpHeaders.CONTENT_TYPE, "image/jpeg"); return ResponseEntity.ok() .headers(headers) .body(bytes); } ``` 另外,如果要返回很大的文件,可以通过StreamingResponseBody实现流式传输,避免一次性读取整个文件。示例代码如下: ``` @GetMapping("/download") public void downloadFile(StreamingResponseBody responseBody) throws IOException { File file = new File("path/to/large_file"); InputStream inputStream = new FileInputStream(file); byte[] buffer = new byte[4096]; int n; while ((n = inputStream.read(buffer)) != -1) { responseBody.write(buffer, 0, n); } inputStream.close(); } ``` 上述方法为读取文件流提供了更加灵活的方法。在使用时可以根据实际需求来选择相应的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值