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

标签 java tomcat

我有一个上传网络应用程序,我必须在保存图像时计算图像的宽度和高度。当我在 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 中运行时,临时文件是在 windows 用户临时文件夹下创建的,而在 tomcat 中运行时,临时文件是在 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-compilter-plugin 配置为 1.6 解决了这个问题。然后构建war文件并再次部署到Tomcat。它工作得很好。还不知道根本原因吗???谁能给我解释一下?

最佳答案

代码中有很多缺陷。我相信你一定忽略了它。

此特定代码将不起作用。

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

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

阅读它时
BufferedImage bImage = ImageIO.read(new FileInputStream(tempFile )); 

它将在 bImage 中存储一个空值。

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

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

2) 如果代码不是很 secret ,我想看看你正在读取文件的代码,我还想看看代码使用的图像路径是什么。

你能把那个也贴一下吗?

关于java - 获取图像宽度和高度时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18500840/

相关文章:

java - JSF 和 AngularJS 之间的异同

tomcat - 每个数据模型的 Mahout servlet

java - 从 Git 存储库将 Web 应用程序部署到 AWS

tomcat - tomcat 日志中的 "TLD skipped"

tomcat - 在所有 servlet 之间共享 JDBC 数据源连接

java - 如何无缝地在tomcat中重新部署 war ?

java - Android小部件未多次更新

java - 让用户创建业务或个人联系人的代码

java - XML 中的串联

java - 让 Rita.WordNet 正常工作