解析来自 Chrome 的多部分请求

Parsing multipart request from Chrome

提问人:Billy Andrews 提问时间:11/9/2023 更新时间:11/9/2023 访问量:11

问:

我正在改造一个有 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)) {  ​

结果没有改变。 有没有人看到我做错了什么?

multipartform-数据

评论


答:

0赞 Billy Andrews 11/9/2023 #1

通过数据包嗅探器,我发现,尽管它在请求标头中声称,Chrome 实际上是以“------WebKitFormBoundary”开始其边界的(请注意开头的两个额外的破折号)。我相应地调整了我的代码,问题解决了。