我更新头像图像并显示它但是头像在Spring Boot中没有变化,为什么?

时间:2016-10-05 06:24:42

标签: spring spring-mvc spring-boot

我使用Spring启动开发网站。我开发了一个上传头像图像的功能,当我更新头像图像并显示它但是头像没有改变并且图像已经在文件夹中发生了变化,为什么?

问题是http缓存?

我的简单项目:

dropbox link to my project

(注意:您需要更改TestingController中的本地路径)

1 个答案:

答案 0 :(得分:0)

您无法立即看到上传的图片,因为您将图像保存在应用程序的静态文件中。您可以在文件夹中看到保存的图像,但如果您调用了网址,则无法看到。如果在上传文件(项目根目录并点击F5)后刷新正在运行的项目,您应该能够看到它。

但更好的解决方案是你有@RequestMapping加载图片并在浏览器中显示。

构建您的项目,尝试使用它:

import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

import org.json.JSONObject;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class TestingController {

    private final Path p = Paths.get("/Users/devin/Documents/workspace-sts-3.8.1.RELEASE/testing/src/main/resources/static/uploads/images");

    @RequestMapping(value={ "/", "/home"})
    public String home(){
        return "home";
    }

    @RequestMapping(value = "/post_upload_avatar_file", method = RequestMethod.POST)
    @ResponseBody
    public Object uploadAvatarFile(@RequestParam("uploadfile") MultipartFile uploadfile) {
        JSONObject resJsonData=new JSONObject();
        try {
            if(uploadfile.isEmpty()){
                System.out.println("Empty");
            }

            Files.copy(uploadfile.getInputStream(), p.resolve(uploadfile.getOriginalFilename()));

            resJsonData.put("status", 200);
            resJsonData.put("message", "Success!");
            resJsonData.put("data", uploadfile.getOriginalFilename());
        }catch (Exception e) {
            System.out.println(e.getMessage());
            resJsonData.put("status", 400);
            resJsonData.put("message", "Upload Image Error!");
            resJsonData.put("data", "");
        }
        return resJsonData.toString();
    }

    @GetMapping("files/{filename:.+}")
    @ResponseBody
    public ResponseEntity<Resource> serverFile(@PathVariable String filename){
        Resource file = loadAsResource(filename);
        return ResponseEntity
                .ok()
                .body(file);
    }

     public Resource loadAsResource(String filename) {
        try {
            Path file = p.resolve(filename);
            Resource resource = new UrlResource(file.toUri());
            if(resource.exists() || resource.isReadable()) {
                return resource;
            }
            else {
                System.out.println("no file");
            }
        } catch (MalformedURLException e) {
            System.out.println(e);
        }
        return null;
    }

    public Stream<Path> loadAll() {
        try {
            return Files.walk(p, 1)
                    .filter(path -> !path.equals(p))
                    .map(path -> p.relativize(path));
        } catch (IOException e) {
            System.out.println(e);
        }
        return null;
    }
}

在这段代码中,我没有实现异常和错误处理。

您可以按原样上传图片。然后你可以调用另一个网址来在你的浏览器中接收图片。

http://localhost:8080/files/testing.png

图片应该是响应。

请查看这两个来源以获得完整的解决方案。

Spring file upload - backend

Spring file upload - frontend