简体   繁体   English

为什么在处理图像文件时出现此错误?

[英]Why am I getting this error when handling an image file?

I am following a tutorial on a book that has a lot of typos/errors. 我正在看一本有很多错别字的书的教程。 I have been able to keep up with it by examining and fixing the obvious as I go whenever the author makes a mistake. 每当作者犯错时,我都可以通过检查并修复显而易见的内容来跟上它的步伐。

Currently I am stuck. 目前我被困住了。 I have a form that uploads an image file, and when the page reloads (after the upload), the image is supposed to show above the form (blank image before upload). 我有一个上载图像文件的表单,当页面重新加载时(上载后),该图像应该显示在表单上方(上载前的空白图像)。 The img src attribute is generated after the upload and handled by Thymleaf and a URL (/uploadedPicture) in the controller, but it seems my code went wrong somewhere since it's not wokring. img src属性是在上载之后生成的,并由Thymleaf和控制器中的URL(/ uploadedPicture)处理,但是似乎我的代码在某个地方出错了,因为它没有唤醒。 I'd like to continue with this somewhat great book. 我想继续读这本很棒的书。

Also, I'm not sure if I'm importing the right Path since there are a few available and the book didn't specify like in other chapters. 另外,我不确定是否要导入正确的Path因为有一些可用的Path ,而本书没有像其他章节中那样指定。

NOTE: When I look at /uploadedPicture on the Chrome console after uploading an image, it threw a 500 error with this message: 注意:上传图像后,当我在Chrome控制台上查看/uploadedPicture时,此消息引发500错误:

{
"timestamp":1454561252135,
"status":500,
"error":"Internal Server Error",
"exception":"org.springframework.beans.ConversionNotSupportedException",
"message":"Failed to convert value of type [org.springframework.core.io.FileSystemResource] to required type [java.nio.file.Path]; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.springframework.core.io.FileSystemResource] to required type [java.nio.file.Path]: no matching editors or conversion strategy found",
"path":"/uploadedPicture"
}

PictureUploadController.java PictureUploadController.java

package masterSpringMvc.profile;

import masterSpringMvc.config.PictureUploadProperties;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLConnection;
import java.nio.file.Path;

@Controller
@SessionAttributes("picturePath")
public class PictureUploadController {
    private final Resource picturesDir;
    private final Resource anonymousPicture;

    @Autowired
    public PictureUploadController(PictureUploadProperties uploadProperties) {
        picturesDir = uploadProperties.getUploadPath();
        anonymousPicture = uploadProperties.getAnonymousPicture();
    }

    @ModelAttribute("picturePath")
    public Resource picturePath() {
        return anonymousPicture;
    }

    @RequestMapping("/upload")
    public String uploadPage() {
        return "profile/uploadPage";
    }

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String onUpload(MultipartFile file,
                           RedirectAttributes redirectAttributes,
                           Model model) throws IOException {
        if (file.isEmpty() || !isImage(file)) {
            redirectAttributes.addFlashAttribute("error",
                    "Incorrect file. Please upload a picture.");
            return "redirect:/upload";
        }

        Resource picturePath = copyFileToPictures(file);
        model.addAttribute("picturePath", picturePath);

        return "profile/uploadPage";
    }

    @RequestMapping(value = "/uploadedPicture")
    public void getUploadedPicture(HttpServletResponse response,
                                   @ModelAttribute("picturePath") Path picturePath)
            throws IOException {
        response.setHeader("Content-Type", URLConnection
                .guessContentTypeFromName(picturePath.toString()));
        IOUtils.copy(anonymousPicture.getInputStream(), response.getOutputStream());
    }

    private Resource copyFileToPictures(MultipartFile file) throws IOException {
        String fileExtension = getFileExtension(file.getOriginalFilename());
        File tempFile = File.createTempFile("pic", fileExtension,
                picturesDir.getFile());

        try (InputStream in = file.getInputStream();
             OutputStream out = new FileOutputStream(tempFile)) {
            IOUtils.copy(in, out);
        }

        return new FileSystemResource(tempFile);
    }

    private boolean isImage(MultipartFile file) {
        return file.getContentType().startsWith("image");
    }

    private static String getFileExtension(String name) {
        return name.substring(name.lastIndexOf("."));
    }
}

uploadPage.html uploadPage.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorator="layout/default">
<head lang="en">
    <title>Profile Picture Upload</title>
</head>
<body>
<div class="row" layout:fragment="content">
    <h2 class="indigo-text center">Upload</h2>

    <div class="col s12 center red-text" th:text="${error}" th:if="${error}">
        Error during upload
    </div>

    <div class="col m8 s12 offset-m2">
        <img th:src="@{/uploadedPicture}" width="100" height="100"/>
    </div>

    <form th:action="@{/upload}" method="post" enctype="multipart/form-data" class="col m8 s12 offset-m2">
        <div class="input-field col s6">
            <input type="file" id="file" name="file"/>
        </div>
        <div class="col s6 center">
            <button class="btn indigo waves-effect waves-light" type="submit" name="save" th:text="#{submit}">
                Submit<i class="mdi-content-send right"></i>
            </button>
        </div>
    </form>
</div>
</body>
</html>

Inject Resource instead of Path as follow: 注入Resource而不是Path ,如下所示:

@RequestMapping(value = "/uploadedPicture")
public void getUploadedPicture(HttpServletResponse response, @ModelAttribute("picturePath") Resource picturePath) throws IOException  {
    response.setHeader("Content-Type", URLConnection.guessContentTypeFromName(picturePath.toString()));
    Path path = Paths.get(picturePath.getURI());
    Files.copy(path, response.getOutputStream());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试从文件中读取文件时为什么会出现错误? - Why am I getting an error when it tries to read from the file? 尝试保存图像时为什么会出现NullPointerException? - Why am i getting NullPointerException when i try to save image? 为什么我在尝试读取 excel 文件时收到数据提供程序不匹配错误? - Why I am getting Data Provider MisMatch error when I try to read from excel file? 为什么我会收到这个错误(未知标签 &lt;:color&gt; ),即使文件中没有这样的标签? - Why am I getting this error (unknown tag <:color> )even when there's no such tag in the file? 在Spring MVC中使用jquery上传文件时,为什么会出现Bad Request类错误? - Why am I getting Bad Request kind error when uploading file using jquery with spring mvc? 使用Scanner读取文件:为什么在Java中使用Scanner读取文件时出现错误? - read a file using Scanner: Why am I getting an error when using Scanner for read files in java? 为什么在android中使用webview时出现错误? - Why I am getting an error when I use webview in android? 为什么在运行应用程序时出现此错误? - Why am I getting this error when I run my app? 为什么会收到{错误? - Why am I getting a { error? 为什么我得到错误? - Why I am getting the error?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM