提问人:Billy Andrews 提问时间:11/9/2023 更新时间:11/9/2023 访问量:11
解析来自 Chrome 的多部分请求
Parsing multipart request from Chrome
问:
我正在改造一个有 20 年历史的 Web 应用程序。应用程序中很长一段时间没有使用过的部分之一是文件上传器。解析分段上传的 Java servlet 包含以下代码,这些代码很久以前就适用于所有浏览器,并且仍然适用于 Firefox:
String boundary = "-----------------------------";
ServletInputStream in = req.getInputStream();
byte[] bytes = new byte[512];
int state = 0;
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
String name = null,
value = null,
filename = null,
contentType = null;
Dictionary fields = new Hashtable();
//Read a line from the request input stream
int i = in.readLine(bytes,0,512);
while (-1 != i) {
String st = new String(bytes,0,i);
//Beginning of parameter - write buffer from previous parameter
if (st.startsWith(boundary)) {
此代码不适用于 Chrome,因为 Chrome 以“----WebKitFormBoundary”而不是“-----------------------------”开始其多部分/表单数据边界。
因此,我更改了servlet,如下所示:
String boundary = "-----------------------------";
String boundary2 = "----WebKitFormBoundary";
ServletInputStream in = req.getInputStream();
byte[] bytes = new byte[512];
int state = 0;
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
String name = null,
value = null,
filename = null,
contentType = null;
Dictionary fields = new Hashtable();
//Read a line from the request input stream
int i = in.readLine(bytes,0,512);
while (-1 != i) {
String st = new String(bytes,0,i);
//Beginning of parameter - write buffer from previous parameter
// if (st.startsWith(boundary)) {
if (st.startsWith(boundary) || st.startsWith(boundary2)) {
结果没有改变。 有没有人看到我做错了什么?
答:
0赞
Billy Andrews
11/9/2023
#1
通过数据包嗅探器,我发现,尽管它在请求标头中声称,Chrome 实际上是以“------WebKitFormBoundary”开始其边界的(请注意开头的两个额外的破折号)。我相应地调整了我的代码,问题解决了。
评论