- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在编写一个动态生成 GIF 文件的端点。我会从头开始。
我有一个名为 Function
的类(class)它像一个抽象类一样工作,我有几个类,在这个例子中 AddFunction
,代表一小块功能。在这种情况下,AddFunction
将一些数字相加。当到达终点时,AddFunction
的ID传递给它(它可以是任何,在这个例子中它是 add 函数)。 Controller 中的代码如下:
/**
* Returns the image for a function
*/
@RequestMapping(value = "/function/{functionId}/image.gif", produces = "image/gif")
public void getImage(@PathVariable(value = "functionId") String functionId, HttpServletResponse response) throws IOException {
Function function = functionService.getFunction(Integer.valueOf(functionId));
Logger logger = Logger.getLogger(FunctionController.class);
ServletOutputStream servOut = response.getOutputStream();
// Uses default values if you pass in nulls.
function.getImage(servOut, null, null);
servOut.flush();
servOut.close();
}
Function
是通过它的 ID 找到的。我已经检查过,并找到了正确的功能。这段代码需要一些验证(例如检查传入的 id 是否为有效数字),但我稍后会讨论。然后我获取 servlet 输出流并将其传递给
getImage
函数的方法。此方法生成描述该函数的 GIF。此代码如下所示:
public void getImage(OutputStream out, String staticContent, String changedContent) throws IOException {
String[] data = {"2", "+", "2", "=", "4"};
Logger logger = Logger.getLogger(AddFunction.class);
logger.info("Getting the add image.");
ImageUtils.writeSequenceToImage(ImageIO.createImageOutputStream(out), data, 5, Constants.IMAGE_HEIGHT / 2);
}
ServletOutputStream
我使用
ImageIO.createImageOutputStream
用
ImageOutputStream
包裹它目的。这是传入
writeSequenceToImage
的时候我自己的方法
ImageUtils
类(class)。最后两个值是写入位置的坐标。在这种情况下,图像的垂直中间,在最左边。
writeSequenceToImage
的代码方法如下:
public static void writeSequenceToImage(ImageOutputStream out, String[] contentList, int x, int y) throws IOException {
StringBuilder dataBuilder = new StringBuilder();
Test test = new Test(out, BufferedImage.TYPE_INT_RGB, 500, true);
Logger logger = Logger.getLogger(ImageUtils.class);
logger.info("Writing sequence to image.");
for (String content : contentList) {
dataBuilder.append(content);
logger.info("writing " + dataBuilder.toString() + " to the gif.");
test.writeToSequence(generateAndWriteToImage(dataBuilder.toString(), x, y));
}
}
Test
(临时名称),其中包含将数据写入 GIF 文件的代码。我在这里所做的只是循环并将每个值添加到 GIF 中的一个帧中。类(class)代码
Test
可以找到
here .我所做的是建立字符串,因此在我们的示例中,日志将输出:
2014-12-31 14:37:15 INFO ImageUtils:48 - Writing sequence to image.
2014-12-31 14:37:15 INFO ImageUtils:53 - writing 2 to the gif.
2014-12-31 14:37:15 INFO ImageUtils:53 - writing 2+ to the gif.
2014-12-31 14:37:15 INFO ImageUtils:53 - writing 2+2 to the gif.
2014-12-31 14:37:15 INFO ImageUtils:53 - writing 2+2= to the gif.
2014-12-31 14:37:15 INFO ImageUtils:53 - writing 2+2=4 to the gif.
ServletOutputStream
,仅当我尝试使用以下 HTML 引用它时:
<div class="panel columns large-12" ng-show="selectedFunction">
<h2>{{selectedFunction.name}}</h2>
<p>{{selectedFunction.description}}</p>
<p>This function expects a {{selectedFunction.expectedParameterType}} as a parameter.</p>
<p>This function will return a {{selectedFunction.expectedReturnType}}</p>
<img src="/autoalgorithm/functions/function/{{selectedFunction.id}}/image.gif" alt="{{selectedFunction.name}}"/>
</div>
ServletOutputStream
与
ByteArrayOutputStream
所以我可以得到数据的大小。如果我这样做,我的代码如下所示:
/**
* Returns the image for a function
*/
@RequestMapping(value = "/function/{functionId}/image.gif", produces = "image/gif")
public @ResponseBody byte[] getImage(@PathVariable(value = "functionId") String functionId, HttpServletResponse response) throws IOException {
Function function = functionService.getFunction(Integer.valueOf(functionId));
Logger logger = Logger.getLogger(FunctionController.class);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Uses default values if you pass in nulls.
function.getImage(baos, null, null);
logger.info("The number of bytes returned is " + baos.toByteArray().length);
return baos.toByteArray();
}
2014-12-31 15:34:09 INFO FunctionController:85 - The number of bytes returned is 0
ImageOutputStream
的引用。在我的 Controller 中。这意味着我可以完全控制对象,所以现在输出的日志:
2014-12-31 15:39:56 INFO FunctionController:85 - The number of bytes returned is 2708
ImageIO
不支持从一个流到另一个流的转换,只支持从一个
BufferedImage
键入另一个。所以我使用了
ImageIO.read
将其读入
BufferedImage
的方法并使用
ImageIO.write
把它写成
gif
到
ServletOutputStream
.这产生了以下错误:
java.lang.IllegalArgumentException: image == null!
最佳答案
正如评论中已经指出的,您的问题有点不简洁,但我会尝试向您展示它是如何工作的。
首先尝试以下操作:
@RequestMapping(value = "/function/{functionId}/image.gif", produces = "image/gif")
public void getImage(@PathVariable(value = "functionId") String functionId, HttpServletResponse response) throws IOException {
BufferedImage firstImage = ImageIO.read(new File("/bla.jpg"));
response.setContentType("image/gif"); // this should happen automatically
ImageIO.write(firstImage, "gif", response.getOutputStream());
response.getOutputStream().close();
}
bla.jpg
的文件放在您的根目录中或更改某个现有图像文件的路径(也可以是 GIF)。确保您至少具有读取访问权限。
generateAndWriteToImage()
替换
ImageIO.read(new File("/bla.jpg"));
。你应该完成。
generateAndWriteToImage()
方法做了什么,但我假设它创建了一个
BufferedImage
的实例,将一些文本写入图像并返回它。
public static BufferedImage generateAndWriteToImage(String string, int x, int y) {
BufferedImage image = new BufferedImage(x,y,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setPaintMode();
g.setFont(g.getFont().deriveFont(30f));
g.drawString(string, 100, 100);
g.dispose();
return image;
}
BufferedImage.TYPE_INT_RGB
的图像,这应该不会导致任何问题。
ImageOutputStream
。
@RequestMapping(value = "/function/{functionId}/image.gif", produces = "image/gif")
public void getImage(@PathVariable(value = "functionId") String functionId, HttpServletResponse response) throws IOException {
Function function = functionService.getFunction(Integer.valueOf(functionId));
ServletOutputStream servOut = response.getOutputStream();
// Uses default values if you pass in nulls.
function.getImage(servOut, null, null);
servOut.flush();
servOut.close();
}
public void getImage(OutputStream out, String staticContent, String changedContent) throws IOException {
String[] data = {"2", "+", "2", "=", "4"};
Logger logger = Logger.getLogger(AddFunction.class);
logger.info("Getting the add image.");
ImageUtils.writeSequenceToImage(ImageIO.createImageOutputStream(out), data, 5, Constants.IMAGE_HEIGHT / 2);
}
ImageOutputStream
(最后一行)创建
ImageIO.createImageOutputStream(out)
的本地实例。
ImageOutputStream
,这可能会导致数据未写入任何其他
OutputStream
(由于缓冲)。
@RequestMapping(value = "/function/{functionId}/image.gif", produces = "image/gif")
public void getImage(@PathVariable(value = "functionId") String functionId, HttpServletResponse response) throws IOException {
Function function = functionService.getFunction(Integer.valueOf(functionId));
ImageOutputStream servOut = ImageIO.createImageOutputStream(response.getOutputStream());
// Uses default values if you pass in nulls.
function.getImage(servOut, null, null);
servOut.close();
}
public void getImage(ImageOutputStream out, String staticContent, String changedContent) throws IOException {
String[] data = {"2", "+", "2", "=", "4"};
Logger logger = Logger.getLogger(AddFunction.class);
logger.info("Getting the add image.");
ImageUtils.writeSequenceToImage(out, data, 5, Constants.IMAGE_HEIGHT / 2);
}
generateAndWriteToImage()
方法。如果它正确返回
BufferedImage
的实例,这应该可以工作(通过重构)。
关于java - 从 ServletOutputStream 输出 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723315/
我正在尝试将一个大的 XML 文件(超过 1.5M)写入 ServletOutputStream,这需要很长时间,接近 7 分钟左右甚至更长。 我正在做的事情如下 - 1. SOAPMessage s
我有一个要求,从 Web 服务(例如:List)获取多个图像,并且必须将这些图像写入 ServletOutputStream。 当我单击“VIEW”链接时,它会调用 servlet,而该 servle
我想压缩动态创建的内容并直接写入ServletOutputStream,而不是在压缩前将其另存为服务器上的文件。 例如,我创建了一个 Excel 工作簿和一个包含带有 SQL 模板的字符串的 Stri
找了很多都没有解决这个问题。我正在用 iText 生成 PDF 文件。如果我使用 FileOutputStream,一切都很好,但是当我尝试使用 ServletOutputStream 时,图像不会出
我遇到了一个无法一致重现的问题。我读取一个文件并将该文件的内容写入 ServletOutputStream。 byte[] buff = new byt
对于内容类型“text/plain”,如果我必须发送大量数据,以下哪个更有效。 ServletOutputStream sos = response.getOutputStream(); sos.wr
这是我在刷新 ServletOutputStream 时遇到的异常。它不会出现在每个请求上,所以我无法重现它。 java.lang.NullPointerException at org.ap
我想知道在创建将内容写入 ServletOutputStream 的 byte[] 时是否有特定规则或最佳实践? byte[] buffer = new byte[1024]; int r
我正在使用 Java 中的一些现有代码开发 Web 服务。 Web 服务使用 ServletResponse 接口(interface)来生成响应。当前代码首先创建 ServletResponse 对
我正在尝试读取 FreemarkerView 渲染的结果: View view = viewResolver.resolveViewName(viewName, locale); view.rende
在执行这段代码时, ServletOutputStream out = response.getOutputStream(); out.write(bytes, 0, bytes.length); o
ServletOutputStream output = response.getOutputStream(); output.write(byte[]); 将 File 写入 javax.servl
我们在服务器端尝试了以下方法, 将 2.5 MB 的文件内容从 MS-Amazon 服务器写入 Java 客户端代码、Android 客户端代码和 IOS 客户端代码大约需要 55 秒 服务器示例代码
我有一个 HttpServlet,我正在尝试为其编写测试并模拟了 ServletOutputStream:ServletOutputStream outputStream = mock(Servlet
我知道之前许多问题的重点是关闭或不关闭 ServletOutputStream,如下所示:Should I close the servlet outputstream?或此处:Should one
据我所知,这属于“你不能那样做”的范畴。我即将重新考虑我的解决方案并解决它,但我认为在这里提问至少值得一试。 我的 JSP/Spring/Struts Servlet 生成报告,将它们写入 PDF,并
我希望这个问题符合 Stack Overflow 问题指南的“软件算法”。 :) 我有一个 Java Web 应用程序,作为服务 Servlet 请求的一部分,它会生成日志记录事件,这些事件会调用持久
我有一个疑问。我有一个项目之前运行成功。但突然间我遇到了下面给出的一个问题 java.lang.InternalError: java.io.IOException: Stream closed at
我正在编写一个动态生成 GIF 文件的端点。我会从头开始。 我有一个名为 Function 的类(class)它像一个抽象类一样工作,我有几个类,在这个例子中 AddFunction ,代表一小块功能
我们有一些生产代码可以有效地执行此代码的操作: http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_Can_I
我是一名优秀的程序员,十分优秀!