如何在MySQL数据库中保存图像 - 代码给定

时间:2015-01-11 17:59:00

标签: java mysql image spring-mvc

我正在尝试在数据库中保存文件。

这是我的代码。

public class DocumentForm {

    @NotNull
    @Size(min = 1)
    private byte[] file;

    public byte[] getFile() {
        return file;
    }

    public void setFile(byte[] file) {
        this.file = file;
    }

...
}

控制器

@RequestMapping(value = "document", method = RequestMethod.POST)
public String signup(@Valid @ModelAttribute DocumentForm documentForm, Errors errors, RedirectAttributes ra) {
    if (errors.hasErrors()) {
        return "document/document";
    }
    Document d = projectRepository.save(documentForm.createDoc());
    MessageHelper.addSuccessAttribute(ra, "document.success");
    return "redirect:/";
}

视图

    <input type="file" name="file" class="btn"></input>
<button type="submit" class="btn">Submit</button>

在数据库中:

它显示图像保存为BLOB

enter image description here

但是,当我尝试查看图像时,通过点击mySQL浏览器中的Open Value in Editor,我看到的只是图像文件的名称。

如何在MySQL DB中保存图像?以及如何检索它并在我的视图上显示

2 个答案:

答案 0 :(得分:0)

您可以使用可以保存表单数据的Part类来完成此操作

Part filePart = request.getPart(“image”);

inputStream = filePart.getInputStream();

statement.setBlob(1,inputStream);

答案 1 :(得分:0)

blob类型是一个二进制字段,它包含任何二进制数据的内容。由于MySql浏览器可能不知道blob的类型,所以它可以为您提供的是名称。数据应该都在那里。

那就是说,我认为你会发现通常图像不存储在数据库中,而是存储对磁盘上图像的引用。这是因为数据库对于大型二进制存储来说效率不高。

您可能希望存储在数据库中以便适当引用图像的内容:

  1. 图片名称
  2. 图像数据的大小
  3. 可能尺寸
  4. 一个规范网址,指示服务器将从何处返回。
  5. 如果您发现自己需要通过servlet容器(tomcat,jboss,w / e)传输图像,那么您可以通过创建流式html响应来实现。像这样的东西,其中InputStream是blob(二进制)数据的流:

     public void serveInputStreamByResponse(HttpServletResponse response, InputStream in) {
            try {
                FileCopyUtils.copy(in, response.getOutputStream());
            } catch (IOException e) {
              // do something
            } finally {
                if (in != null) {
                    try {
                        in.close();    // very important
                    } catch (IOException e) {
                        // do something
                    }
                }
            }
        }