2

我需要有关 servlet 的帮助。

我需要在一个请求中读取一个 inputStream 并编写一个 tiff 文件。inputStream 带有请求标头,我不知道如何删除这些字节并只写入文件。

查看 writen 文件中的初始字节。

-qF3PFkB8oQ-OnPe9HVzkqFtLeOnz7S5Be
Content-Disposition: form-data; name=""; filename=""
Content-Type: application/octet-stream; charset=ISO-8859-1
Content-Transfer-Encoding: binary

我想删除它并只从 tiff 文件中写入字节。PS:文件的发件人不是我。

4

3 回答 3

1

我不确定您为什么不使用 HttpServletRequest 的 getInputStream() 方法来获取没有标头的内容,无论哪种方式,您都可以选择开始读取输入流并忽略内容,直到找到两个连续的 CRLF,它定义了标题的结尾。

一种方法是这样的:

String headers = new java.util.Scanner(inputStream).next("\\r\\n\\r\\n");
// Read rset of input stream
于 2012-07-13T14:26:10.333 回答
1

Apache commons 解决了你 90% 的问题......只需要知道在搜索中使用什么关键字 :)
“解析多部分请求”和谷歌说: http://www.oreillynet.com/onjava/blog/2006/06/parsing_formdata_multiparts。 html

int boundaryIndex = contentType.indexOf("boundary=");
byte[] boundary = (contentType.substring(boundaryIndex + 9)).getBytes();

ByteArrayInputStream input = new ByteArrayInputStream(buffer.getBytes());
MultipartStream multipartStream =  new MultipartStream(input, boundary);

boolean nextPart = multipartStream.skipPreamble();
while(nextPart) {
  String headers = multipartStream.readHeaders();
  System.out.println("Headers: " + headers);
  ByteArrayOutputStream data = new ByteArrayOutputStream();
  multipartStream.readBodyData(data);
  System.out.println(new String(data.toByteArray());

  nextPart = multipartStream.readBoundary();
}
于 2012-07-14T11:30:44.330 回答
0

对我来说,我使用这样的注释和参数:

@Consumes(MediaType.APPLICATION_OCTET_STREAM)

公共响应 testUpload(文件上传输入流)

然后我可以读取文件内容:

 byte[] totalBytes = Files.readAllBytes(Paths.get(uploadedInputStream.toURI()));

然后我必须忽略前 4 行,以及内容结尾部分,如下所示:

int headerLen = 0;
int index = 0;
while(totalBytes[index] != '\n' && index < totalBytes.length) {
    headerLen++;
    index++;
}
            
//ignore next three line
for (int i = 0; i < 3; i++) {
    index++;
    while (totalBytes[index] != '\n' && index < totalBytes.length) {
        index++;
    }
}
index++;
out.write(totalBytes, index, totalBytes.length - index - (headerLen+3));
out.flush();
out.close();
于 2021-04-16T04:25:43.530 回答