2017-09-07 30 views
0

我试图让内Azure的Azure的逻辑应用程序HTTP POST的multipart/form-data的文件上传

我能够拨打电话成功通过后请人用HTTP逻辑应用程序的API。看到我的帖子的人配置

Post Man Configuration

我从邮递员,因为这参阅http码,我用这使逻辑应用程序进行格式化类似于邮递员了。

POST /dcma/rest/initiateOcrClassifyExtract HTTP/1.1 

Host: godemo.ephesoft.com 

Authorization: Basic NDU=?????? 

Cache-Control: no-cache 

Postman-Token: 3baf23e7-6b46-a5f4-094b-3df1879bbe21 

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 

------WebKitFormBoundary7MA4YWxkTrZu0gW 
Content-Disposition: form-data; name="000001.pdf"; filename="000001.pdf" 
Content-Type: application/pdf 


------WebKitFormBoundary7MA4YWxkTrZu0gW 
Content-Disposition: form-data; name="batchClassIdentifier" 

BC590 

------WebKitFormBoundary7MA4YWxkTrZu0gW-- 

下面是实际的逻辑应用http配置。

Logic App config

服务器上的日志显示下面的错误

2017-09-07 20:12:51,784 [ajp-apr-8009-exec-3] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/dcma].[DispatcherServlet]- Servlet.service() for servlet [DispatcherServlet] in context with path [/dcma] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Header section has more than 10240 bytes (maybe it is not properly terminated)] with root cause 
org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Header section has more than 10240 bytes (maybe it is not properly terminated) 
    at org.apache.commons.fileupload.MultipartStream.readHeaders(MultipartStream.java:541) 
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:999) 
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:965) 
    at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331) 
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351) 
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158) 
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142) 
    at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1070) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:912) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at com.ephesoft.dcma.webapp.AuthenticationFilter.doFilter(AuthenticationFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at com.ephesoft.dcma.webapp.SessionTimeoutFilter.doFilter(SessionTimeoutFilter.java:43) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:230) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at com.ephesoft.dcma.webapp.HTTPHeaderFilter.doFilter(HTTPHeaderFilter.java:75) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) 
+0

我的回答能帮助你吗?任何进展? –

回答

1

从你提供的日志信息,我发现你在后端使用的apache.commons.fileupload库。 因此,我创建了一个简单的servlet web项目,其中包含以下核心代码以及apache.commons.fileupload库来处理上传的文件。

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileItemFactory; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

@WebServlet("/HelloWorldByPostman") 
public class HelloWorldByPostman extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public HelloWorldByPostman() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
    *  response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

//  String savePath = this.getServletContext().getRealPath("/WEB-INF/upload"); 

     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
     System.out.println(isMultipart); 

     if(isMultipart){ 
      FileItemFactory factory = new DiskFileItemFactory(); 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      List<FileItem> items = null; 
      try { 
       items=upload.parseRequest(request); 
       System.out.println(items.toString()); 
      } catch (FileUploadException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      Iterator<FileItem> iterator = items.iterator(); 
      while(iterator.hasNext()){ 
       FileItem item = iterator.next(); 
       if(item.isFormField()){ 
        System.out.println("is txt........"+item.getFieldName()); 
       }else{ 
        System.out.println("is file..........."+item.getFieldName()); 
       } 
      } 
     } 

     response.getWriter().append("Served at: ").append("jaygong"); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
    *  response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     doGet(request, response); 
    } 

} 

然后,我部署的项目Azure Web App,这样我可以通过HTTP请求上传文件。

邮差:

enter image description here

enter image description here

结果: enter image description here

逻辑应用程序:

enter image description here

结果:

enter image description here

当动作post和Content-Type类型是multipart/form-data,浏览器将采取的形式控制单元分割,并为每个部分加上Content-Disposition(form-da ta或文件),Content-Type(默认是文本/纯文本),名称(名称控制)和其他信息,并添加边界。

Content-Type属性已经包含在Body一部分,所以你可以在Header部分去除Content-Type设置,然后重试POST请求。

希望它可以帮助你。

相关问题