从InputStream创建文件

时间:2014-04-16 14:05:36

标签: java inputstream outputstream

我试图将客户端提供的文件复制到临时文件中。

我的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的原因。所以我试着在阅读期间制作一份副本。但它不起作用。我该怎么办?

由于

3 个答案:

答案 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。如果文件未关闭,我们无法读取该文件。

希望它会帮助别人:) 谢谢你的时间!