我正在尝试制作一个网络应用,您可以上传保存在我的文件系统中的文件,然后在某个地址(如imgur)提供给用户。
当我上传文件时,它会保存到文件系统,并将其信息保存到数据库中。再次找到该文件并将正确的位置发送到相应的jsp文件。但是,jsp文件不显示图像,这是问题所在。如果我重新启动服务器并转到相同的地址,那么jsp会正确显示文件,但显然每次上传文件时我都无法重新启动服务器以显示它。
这是我的UploadController。它只需要一个post请求中的文件,标签和类型,将当前文件以随机生成的名称写入文件系统中的某个位置,并存储有关该文件的信息(类型,标签,名称及其位置)文件系统)在数据库中:
package project.controller;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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.multipart.MultipartFile;
import project.service.MediaFile;
import project.service.MediaFileRepository;
@Controller
public class UploadController {
private final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private Random rnd = new Random();
private int randomLength = 8;
@Autowired
private MediaFileRepository repository;
@RequestMapping(value = "/uploadmedia", method = RequestMethod.GET)
public String uploadForm() {
return "upload";
}
@RequestMapping(value = "/uploadmedia", method = RequestMethod.POST)
public String uploadSubmit(@RequestParam(value="files[]") MultipartFile[] files,
@RequestParam("tags[]") String[] tags, @RequestParam("types[]") String[] types)
{
String[] tagsArray;
MultipartFile file;
String name;
String tag;
String path;
String type;
for (int i = 0; i < files.length; i++) {
file = files[i];
tagsArray = tags[i].split("\\s+");
type = types[i];
name = randomString(randomLength);
List<MediaFile> nameExists = repository.findByName(name);
while (nameExists.size() > 0) {
name = randomString(randomLength);
nameExists = repository.findByName(name);
}
path = "/Users/.../src/main/resources/static/img/" + name + type;
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
BufferedOutputStream stream =
new BufferedOutputStream(new FileOutputStream(new File(path)));
stream.write(bytes);
stream.close();
for (int j = 0; j < tagsArray.length; j++) {
tag = tagsArray[j].toLowerCase();
repository.save(new MediaFile(name, tag, path, type));
}
System.out.println("Success!");
} catch (Exception e) {
System.out.println("Failure... " + e.getMessage());
}
} else {
System.out.println("file is empty");
}
}
return "upload";
}
private String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ )
sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
return sb.toString();
}
}
...接下来,这是我的MediaController(正在上传的文件是某种媒体)。它只是检查一个url是否在数据库中有一个具有相应名称的文件,如果是,则将该文件的路径发送到media.jsp。
package project.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import project.service.MediaFile;
import project.service.MediaFileRepository;
import java.util.List;
/**
* Created by johannesthorkell on 13.10.2015.
*/
@Controller
@RequestMapping("/media")
public class MediaController {
@Autowired
private MediaFileRepository repository;
@RequestMapping("/{media}")
public String newMedia(@PathVariable String media, Model model) {
List<MediaFile> nameExists = repository.findByName(media);
if (nameExists.size() > 0) {
MediaFile mediaFile = nameExists.get(0);
String name = mediaFile.getName();
String type = mediaFile.getType();
model.addAttribute("image", "/img/" + name + type);
return "media";
}
return "error";
}
}
...最后,这是我的media.jsp文件。它只是从我的MediaController接收文件位置并将其作为img元素的src属性(我用来测试它的文件是图像文件)。
<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Home</title>
</head>
<h1>Media Upload</h1>
<img src="${image}">
<div id="links">
<a href="/uploadmedia">upload media</a>
<a href="/searchmedia">search media</a>
</div>
</body>
</html>
答案 0 :(得分:2)
我怀疑这是因为您将图像上传到源树中,而不是上传到应用程序实际运行的位置(例如target
目录)。要使其可以直接通过URL访问,您必须将图像存储在运行Web应用程序的同一目录中。
重新加载后它工作的原因是源代码树中的所有内容在构建时都会复制到target
目录。