- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个用户可以上传图片的网站。
我为此创建了一个 Spring Controller 。当用户上传图像时,我想将其转换为 PNG,然后将其上传到 AWS S3 文件夹。在 Windows 上一切正常,但在 Linux 上 PNG 转换失败并出现 java.lang.IllegalArgumentException: image == null!
。
Windows 和 Linux 都安装了相同的 Oracle JDK,java 版本为 1.8.0_161。
这些是服务器上可用的图像阅读器:
Oracle Corporation | 0.5 | Standard JPEG Image Reader
Oracle Corporation | 1.0 | Standard BMP Image Reader
Oracle Corporation | 1.0 | Standard WBMP Image Reader
Oracle Corporation | 1.0 | Standard GIF image reader
Oracle Corporation | 1.0 | Standard PNG image reader
我用 JPG、PNG 和 GIF 文件对其进行了测试。他们都失败了。
确切的异常(exception)是:
018-04-05 06:23:57.414 ERROR 31434 --- [p-nio-80-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: image == null!] with root cause
java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1592)
at javax.imageio.ImageIO.write(ImageIO.java:1578)
at com.morethanheroic.restaurantapp.restaurant.service.logo.RestaurantLogoUploader.convertImageToPng(RestaurantLogoUploader.java:69)
当我禁用 PNG 转换并仅将原始图像上传到 S3 时,从 Linux 上传的图像尺寸会稍大(大约 +30%)。正确的图像显然是从 Windows 上传的图像。
我发布了所有相关代码,因为我不确定女巫步骤会导致问题。
这是我的 Controller :
package com.morethanheroic.restaurantapp.restaurant.view.controller;
import com.morethanheroic.restaurantapp.restaurant.domain.RestaurantEntry;
import com.morethanheroic.restaurantapp.restaurant.service.RestaurantEntryFactory;
import com.morethanheroic.restaurantapp.restaurant.service.logo.RestaurantLogoUploader;
import com.morethanheroic.restaurantapp.restaurant.view.controller.exception.UnauthorizedAccessException;
import com.morethanheroic.restaurantapp.restaurant.view.service.file.FileConverter;
import com.morethanheroic.user.domain.UserEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/restaurant/{restaurantId}/logo")
@RequiredArgsConstructor
public class RestaurantLogoUploadController {
private final RestaurantEntryFactory restaurantEntryFactory;
private final RestaurantLogoUploader restaurantLogoUploader;
private final FileConverter fileConverter;
@PostMapping("/upload")
public void uploadFile(final UserEntity userEntity, @PathVariable final int restaurantId,
@RequestPart("logo") final MultipartFile logo) {
final RestaurantEntry restaurantEntry = restaurantEntryFactory.getRestaurant(restaurantId);
if (!restaurantEntry.isOwner(userEntity)) {
throw new UnauthorizedAccessException();
}
restaurantLogoUploader.uploadLogo(restaurantEntry, fileConverter.convertMultiPartToFile(logo));
}
}
文件转换器:
package com.morethanheroic.restaurantapp.restaurant.view.service.file;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@Slf4j
@Service
public class FileConverter {
public File convertMultiPartToFile(final MultipartFile multipartFile) {
final File result = new File(multipartFile.getOriginalFilename());
try (final FileOutputStream fos = new FileOutputStream(result)) {
fos.write(multipartFile.getBytes());
} catch (IOException e) {
log.error("Unable to convert MultiPart to File!", e);
}
return result;
}
}
这是发生转换的实际图片 uploader 。
package com.morethanheroic.restaurantapp.restaurant.service.logo;
import com.amazonaws.services.s3.AmazonS3;
import com.morethanheroic.restaurantapp.restaurant.domain.RestaurantEntry;
import com.morethanheroic.restaurantapp.restaurant.service.logo.configuration.RestaurantLogoProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@Slf4j
@Service
public class RestaurantLogoUploader {
private final AmazonS3 amazonS3;
private final RestaurantLogoProperties restaurantLogoProperties;
private final RestaurantLogoNameFactory restaurantLogoNameFactory;
public RestaurantLogoUploader(@Qualifier("amazonLogoUploaderS3Client") final AmazonS3 amazonS3,
final RestaurantLogoProperties restaurantLogoProperties,
final RestaurantLogoNameFactory restaurantLogoNameFactory) {
this.amazonS3 = amazonS3;
this.restaurantLogoProperties = restaurantLogoProperties;
this.restaurantLogoNameFactory = restaurantLogoNameFactory;
}
public void uploadLogo(final RestaurantEntry restaurant, final File restaurantLogo) {
final String logoName = restaurantLogoNameFactory.buildName(restaurant);
amazonS3.putObject(restaurantLogoProperties.getBucketName(), logoName, convertImageToPng(restaurantLogo));
}
private File convertImageToPng(final File inputFile) {
log.info("Converting file " + inputFile.getAbsolutePath() + " to png.");
try {
final BufferedImage bufferedImage = ImageIO.read(inputFile);
final ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", byteArrayOut);
final byte[] resultingBytes = byteArrayOut.toByteArray();
final File result = new File(inputFile.getName());
FileOutputStream fos = new FileOutputStream(result);
fos.write(resultingBytes);
fos.close();
return result;
} catch (IOException e) {
throw new RuntimeException("Unable to convert image.");
}
}
}
最佳答案
Web 应用不应以 root
(管理员权限)运行,因此不允许访问 /root 目录。在别处配置上传目录。
关于java - Linux 上 Spring MVC 图片上传和 ImageIO 转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49665735/
在javax.imageio.ImageIO中,有一个方法#write(RenderedImage im, String formatName, OutputStream output),它接受开发人
我对此问题感到非常困惑。我在jai-imageio-core上使用的是1.3.0版本,请检查下面的依赖关系,我完全不知道如何从jar中找出如何在JVM中加载一个类文件(RawImageReaderSp
我的应用程序正在将图像保存到文件夹中。同时另一个软件监视该文件夹并打印粘贴的图像。 我遇到的问题是打印应用程序可以在打印机上发送一半渲染的图像,或者根本不对保存的图像使用react。 我正在使用 ja
在下面的代码片段中,我尝试使用 javax.imageio.ImageIO 设置我的 JFrame 实例的图标,但出现以下异常。你能告诉我我缺少什么吗? import javax.imagei
我正在尝试将 Spring Web 应用程序部署到在 Windows Azure 上的生产环境中运行的 Tomcat 7(尝试过 Ubuntu 和 Windows Datacenter VM)。遗憾的
在使用套接字通过网络传输图像时,我遇到了一个奇怪的问题: 当我使用 ImageIO.write() 将图像写入一个套接字的 OutputStream 并使用 ImageIO.write() 从另一个套
下面您将看到一张来自土耳其的名为“simit”的精美糕点图片。它取自 iPad 2,因此它是尺寸为 720*960 的 JPEG。 问题是,当我使用 javax.imageio.ImageIO.rea
我在 Tomcat 5.5 中有一个 Servlet,它读取文件夹中的本地镜像。然后将图像发送回 Applet。 我收到此消息“javax.imageio.IIOException:无法创建 Imag
我有一张图片,称之为 grayscale.jpg。现在我在 The Gimp 中打开该图像并将颜色模式更改为 RGB 并将其保存为 color.jpg。如果我在任何图像查看器中查看 grayscale
这个问题在这里已经有了答案: Can't import javax.imageio.ImageIO in Android application (1 个回答) 关闭 9 年前。 当我试图做的时候,
我想将 Canvas 对象保存为图像,为此我想使用 ImageIO 类。我正在使用 Eclipse,但是当我尝试导入此库时(导入 javax.imageio.ImageIO;)Eclipse 向我显示
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws IOExceptio
我正在尝试通过套接字发送图像,但我遇到了一个奇怪的问题。ImageIO.write 发送的数据比 ImageIO.read 接收的数据多。例如,如果我在循环中有以下代码: (客户端) out.writ
我在 python 中处理一些图像,我正在尝试将一系列大小为 961x509 的图像转换为 MP4 电影文件。我已经这样做了并且它正在工作但是我有一个非常烦人的问题,警告说是这样的: WARNING:
Apple 的图像 I/O 编程指南说道: Image I/O resides in the Application Services framework in Mac OS X, and in th
我一直在开发一个程序,其中使用来自此 API (musicg) 的代码:http://code.google.com/p/musicg/ 但是,我的代码中仍有一部分给我带来了麻烦(GraphicRen
我无法加载 JAI 1.3.0 的 ImageIO 类。 Java 6 和 Web 应用程序服务器 (WAS) 8.5。我的代码适用于 Java 6 和 WAS(7.0.19)。 我已经在 pom.x
我一直在使用 javax.imageio.ImageIO 中的 ImageIO.read() 和 ImageIO.write() 方法来读取和写入图像,我发现有些图像的颜色发生了奇怪的变化。 即使我将
如果图像不是RGB颜色,如何解码图像。它应该通过支持所有格式(Jpg、Png、Gif来解码图像) code>..etc) 任何 api 都可以解码。 这是失败的代码行。那么可以使用哪种方法来解决该问题
以下测试在 Java 9 上失败,而在 Java 8 中通过: @Test public void getImage_SetValueUsingConstructor_ShouldReturnCorr
我是一名优秀的程序员,十分优秀!