我有一个上传网络应用程序,我必须在保存图像时计算图像的宽度和高度。当我在eclipse中运行tomcat下的项目时,一切正常。但是当我在eclipse之外的tomcat中运行它时,我得到一个NullpointerException。
File tempFile = File.createTempFile("temp", "jpg");
//decode image stream and write to temp file.
BufferedImage bImage = ImageIO.read(new FileInputStream(tempFile ));
int width = bImage.getWidth();
int height = bImage.getHeight();
我可以看到的不同之处在于,当我在eclipse中运行时,tempfile是在windows user temp文件夹下创建的,而在tomcat中运行时,tempfile是在tomcat temp文件夹下创建的。我已经将文件大小写入日志,并且两次都实际上有大小。
我在这里添加了更多代码,以便每个人都有经验可以拥有我
@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes="application/octet-stream")
@ResponseBody
public String handleStreamUpload(HttpServletRequest request, HttpServletResponse response) throws IOException {
InputStream imageEncodeStream = request.getInputStream();
File tempFile = File.createTempFile("-TEMP-", ".temp");
MessageDecoder decoder = new MessageDecoder(
imageEncodeStream, tempFile);
decoder.decode();
String resolution = getResolution();
//generate unique image name and add resolution to image name.
}
解码器代码:
public void decode() throws IOException {
//Some secret decode part here.
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
FileOutputStream fos = new FileOutputStream(file);
int bs = 16384;
byte[] buf = new byte[bs];
try {
int off = 0;
for (;;) {
int bytes = in.read(buf, off, bs - off);
if (bytes < 0) { // EOF
if (off > 0) {
fos.write(buf, 0, off);
}
break;
}
if (bytes == 0) {
try {
Thread.sleep(2);
} catch (InterruptedException ignore) {
ignore.printStackTrace();
}
} else if ((off += bytes) == bs) {
fos.write(buf);
off = 0;
}
}
} finally {
fos.close();
}
}
更新:我通过将maven-compilter-plugin配置为1.6解决了这个问题。然后构建war文件并再次部署到Tomcat。它工作得很好。真的不知道根源造成的???任何人都可以向我解释一下吗?
答案 0 :(得分:0)
代码中存在很多缺陷。我相信你一定忽略了它。
此特定代码无效。
File tempFile = File.createTempFile("temp", "jpg");
创建一个名为tempXXXjpg的空文件。所以当你用
阅读它时BufferedImage bImage = ImageIO.read(new FileInputStream(tempFile ));
它将在bImage中存储空值。
它可能会给你一个空指针异常。您需要读取现有文件而不是创建临时文件。如果要求是创建临时文件,则复制文件并从中创建临时文件。
修改强> 我在这里感觉到两个问题,如下所述: 1)尝试读取文件的应用程序代码可能无法访问原始映像相对于tomcat webapp目录的位置。
2)如果代码不是很秘密,我希望看到你的代码正在读取文件,我也想看看代码正在使用的图像路径是什么。
你能不能粘贴它?