有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

获取图像宽度和高度时出现java NullPointerException

我有一个上传的网络应用程序,我必须计算图像的宽度和高度时,保存图像。当我在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用户临时文件夹下创建的,而在tomcat中运行时,tempfile是在tomcat临时文件夹下创建的。我已经将文件大小写入日志,这两次,它们实际上都有大小

我在这里添加了更多的代码,这样每个有经验的人都可以拥有我

@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编译器插件配置为1.6解决了这个问题。然后构建war文件并再次部署到Tomcat。它很好用。还不知道是什么原因造成的???谁能给我解释一下吗


共 (1) 个答案

  1. # 1 楼答案

    代码中有很多缺陷。我相信你一定是忽视了这一点

    这个特定的代码不起作用。

    File tempFile = File.createTempFile("temp", "jpg"); 
    

    创建名为tempXXXjpg的空文件。所以当你使用

    BufferedImage bImage = ImageIO.read(new FileInputStream(tempFile )); 
    

    它将在bImage中存储空值

    它可能会给您一个空指针异常。您需要读取已存在的文件,而不是创建临时文件。如果要求创建临时文件,则复制一个文件并从中创建临时文件

    编辑 我在这里感觉到两个问题,如下所述: 1) 原始映像相对于tomcat webapp目录的位置可能无法被尝试读取该文件的应用程序代码访问

    2)如果代码不是很机密,我想看看您正在读取文件的代码,我也想看看代码使用的图像路径是什么

    你能把它也贴上吗