我试图将客户端提供的文件复制到临时文件中。
我的REST服务将此给定文件检索到InputStream中。
这是我的代码:
@POST
@Path("fileupload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
@FormDataParam("uploadFormElement") InputStream uploadedInputStream,
@FormDataParam("uploadFormElement") FormDataContentDisposition fileDetail)
throws IOException {
Response.Status respStatus = Response.Status.OK;
if (fileDetail == null) {
respStatus = Response.Status.INTERNAL_SERVER_ERROR;
} else {
if (uploadedInputStream != null) {
try {
initPath();
int size = 0;
int bytesRead;
boolean isStreamSizeCorrect = true;
byte[] buffer = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((bytesRead = uploadedInputStream.read(buffer)) != -1) {
if (size > OntoWebStudioUtil.getUploadFileLimit()) {
isStreamSizeCorrect = false;
baos.close();
while ((bytesRead = uploadedInputStream.read(buffer)) != -1) {
size++;
}
break;
} else {
baos.write(buffer, 0, bytesRead);
}
size++;
}
if (!isStreamSizeCorrect) {
respStatus = Response.Status.NOT_ACCEPTABLE;
return Response
.status(respStatus)
.entity("Size of uploaded file exceeds the limit"
+ OWSConstants.UPLOAD_RESPONSE_VALUE_SEPARATOR
+ size).build();
}
byte[] outBuf = baos.toByteArray();
String newFilePath = "C:\\Docs\\my_pic.png";
FileOutputStream fos = null;
try {
fos = new FileOutputStream(newFilePath);
fos.write(outBuf);
}
catch (IOException e) {
e.printStackTrace(System.err);
}
finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
respStatus = Response.Status.INTERNAL_SERVER_ERROR;
e.printStackTrace(System.out);
}
}
}
return Response
.status(respStatus)
.entity(tempFileName
+ OWSConstants.UPLOAD_RESPONSE_VALUE_SEPARATOR
+ currentFileName).build();
}
}
我遇到的问题是我临时目录中创建的文件是空的。 我必须在创建之前测试文件的大小。这就是我读我的InputStream的原因。所以我试着在阅读期间制作一份副本。但它不起作用。我该怎么办?
由于
答案 0 :(得分:3)
如果您使用的是Java SE 7或更高版本,则可以使用Files.copy。
答案 1 :(得分:1)
代码基本上是正确的。所以唯一的结论是:is.read(bytes)
被调用,但返回-1,所以InputStream is
已经被读取一次到流尾。
第二种可能性e.printStackTrace()
将会转到您未看到的地方(System.err
)。如果您确实看到Done!
,请尝试e.printStackTrace(System.out)
。
数据中有-1是没问题的。
答案 2 :(得分:0)
解决方案:我找到了似乎有用的东西。也许这不是很好,所以欢迎其他建议! 它是: 我宣布
ByteArrayOutputStream baos = new ByteArrayOutputStream();
我在阅读我的InputStream并检查大小
时写下它while ((bytesRead = uploadedInputStream.read(buffer)) != -1) {
if (size > OntoWebStudioUtil.getUploadFileLimit()) {
isStreamSizeCorrect = false;
baos.close();
while ((bytesRead = uploadedInputStream.read(buffer)) != -1) {
size++;
}
break;
} else {
baos.write(buffer, 0, bytesRead);
}
size++;
}
然后我声明一个ByteArrayInputStream来获取我写入ByteArrayOutputStream的内容。最后我使用Apache commons-io复制方法。
fos = new FileOutputStream(newFilePath);
ByteArrayInputStream newStream = new ByteArrayInputStream(baos.toByteArray());
IOUtils.copy(newStream, fos);
我在调用此方法之前声明了我的FileOutputStream,以便关闭FileOutputStream。如果文件未关闭,我们无法读取该文件。
希望它会帮助别人:) 谢谢你的时间!