【问题标题】:Uploading files to spring mvc server - best practice将文件上传到 spring mvc 服务器 - 最佳实践
【发布时间】:2012-12-12 20:24:12
【问题描述】:

在无状态移动应用程序中,我需要从移动客户端将图像文件上传到我的服务器,该服务器公开基于 Spring MVC 的 Web 层(稍后我将需要对该图像执行 OCR 过程,但这与这一点)。

我见过的所有 spring MVC 文件上传示例都是基于 MultipartFiles 的,它不符合我的需求,因为它们假设 modelAndView 存在,但我的服务器是无状态的,我不使用模型或视图,也不使用 http会话,只有纯简单的 JSON 格式的 restful 请求。

我想知道最好的方法是什么?

现在,我创建了一个测试,将我的图像作为字符串发送到我的服务器(使用 base64 编码)。比如:

ClassPathResource myFile= new ClassPathResource("imageName.jpg");
byte[] fileByteArray = Files.readAllBytes(myFile.getFile().toPath());
String imageAsString = Base64.encodeBase64URLSafeString(fileByteArray);

现在我将这个 imageAsString 发送给我的控制器。 然后,在我的控制器中,我可以使用以下方式将此字符串解码回字节数组:

public static byte[] decodeFile(String fileDataString) {
return Base64.decodeBase64(fileDataString);
}

所以在我的服务器中,我现在持有一个字节数组,它是原始数据,除了将它写入 FileOutputStream 之外,我不确定我可以用它做任何事情。有人可以推荐将图像上传到我的服务器的良好做法吗?

【问题讨论】:

    标签: spring-mvc file-upload image-uploading


    【解决方案1】:

    您可以使用 MultipartFile 执行此操作,而无需使用如下所示的模型和视图。

    @RequestMapping(value="/rest/files", method=RequestMethod.POST,consumes="multipart/form-data", produces="application/json")
    @ResponseBody()
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            if (!file.isEmpty()) {
                byte[] bytes = file.getBytes();
                // store the bytes somewhere
                return  "{\"success\": true}";
            } else {
                return  "{\"success\": false}";
            }
        } catch (Exception ex) {
            return  "{\"success\": false}";
        }
        return  "{\"success\": false}";
    }
    

    【讨论】:

    • 我想发送多个文件,所以我有我的新“文件”对象,它包装了一个 MultipartFile 对象列表。我真的应该将我的“文件”对象作为 RequestParam 发送吗?它不应该是@RequestBody 的一部分吗?假设我使用的是 RestTemplate,我的电话应该是什么样子?谢谢!
    【解决方案2】:

    由于将 MultipartFile 上传到 Spring MVC Web 层需要进行多项更改(servlet 上下文更改、消息转换器更改、控制器调整等),我找不到任何完整和简单的教程,我决定简单地上传我的文件(图像)作为 Base64 编码的字符串。为此,我使用了 org.apache.commons.codec.binary.Base64,它提供了 encodeBase64URLSafeString 方法,可以将我的文件编码为字符串,然后使用 decodeBase64 将其解码回原始文件内容。这样我就不会在途中丢失任何数据,并且避免了任何复杂的更改。这种方法的缺点是它需要我的客户以与 encodeBase64URLSafeString 方法完全相同的方式对文件进行编码,所以我很确定它不是最优的。 .

    【讨论】:

      猜你喜欢
      • 2012-09-19
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 2016-05-26
      • 2020-06-05
      • 2015-04-19
      • 2011-05-18
      相关资源
      最近更新 更多