我正在尝试编写一个简单的服务器,它使用套接字并在从浏览器收到http请求时从光盘读取图像。
我能够收到请求,从光盘读取图像并将其传递给浏览器(然后浏览器自动下载图像)。但是,当我尝试打开下载的图像时,它会显示:
Could not load image 'img.png'. Fatal error reading PNG image file: Not a PNG file
所有其他类型的扩展(jpg,jpeg,gif等...)
也是如此你能帮助我,告诉我我做错了什么吗?我怀疑我读取图像的方式可能有问题,或者可能需要指定一些编码?
从光盘读取图像:
// read image and serve it back to the browser
public byte[] readImage(String path) {
File file = new File(FILE_PATH + path);
try {
BufferedImage image = ImageIO.read(file); // try reading the image first
// get DataBufferBytes from Raster
WritableRaster raster = image.getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
return data.getData();
} catch (IOException ex) {
// handle exception...
}
return ("Could not read image").getBytes();
}
通过套接字写入数据:
OutputStream output = clientSocket.getOutputStream();
output.write(result);
在这种情况下,结果包含readImage方法生成的字节数组。
编辑:第二次尝试将图像作为普通文件读取
FileReader reader = new FileReader(file);
char buf[] = new char[8192];
int len;
StringBuilder s = new StringBuilder();
while ((len = reader.read(buf)) >= 0) {
s.append(buf, 0, len);
byte[] byteArray = s.toString().getBytes();
}
return s.toString().getBytes();
答案 0 :(得分:2)
您可以使用ByteArrayOutputStream,例如,
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
然后你可以写为socket,
outputStream.write(byteArrayOutputStream.toByteArray());