【问题标题】:Pentaho - upload file using APIPentaho - 使用 API 上传文件
【发布时间】:2018-02-27 04:40:33
【问题描述】:

我需要使用 API 上传文件。

我尝试了 REST CLIENT,但没有找到任何选项。 尝试使用 HTTP POST 并以 415 响应。

请建议如何完成此操作

【问题讨论】:

    标签: pentaho pdi spoon


    【解决方案1】:

    错误 415 是“不支持的媒体类型”。 您可能需要更改请求的媒体类型或检查远程服务器是否接受该类型的文件。

    https://en.m.wikipedia.org/wiki/List_of_HTTP_status_codes

    【讨论】:

    • 我确实将内容类型设置为 multipart/form-data,但得到了相同的响应。在与 Postman 核对时,我删除了 content ttype 的标题并且它能够上传。如果我没有设置内容类型,它会自动将其设置为 Text/xml。至少,如果我可以让 http post 不设置内容类型,它可能会很有用。另外,虽然这看起来很幼稚,但还有另一种方法吗?除了使用 HTTP 帖子
    【解决方案2】:

    此解决方案仅使用 jre 7 的标准类。在您的转换中添加一个步骤 Modified Java Script Value。您必须在流程中添加两列:URL_FORM_POST_MULTIPART_COLUMNFILE_URL_COLUMN,您可以添加任意数量的文件,只需多次调用 outputStreamToRequestBody.write

        try
        {
            //in this step you will need to add two columns from the previous flow -> URL_FORM_POST_MULTIPART_COLUMN, FILE_URL_COLUMN 
            var serverUrl =  new java.net.URL(URL_FORM_POST_MULTIPART_COLUMN);
    
            var boundaryString = "999aaa000zzz09za";
            var openBoundary  = java.lang.String.format("\n\n--%s\nContent-Disposition: form-data\nContent-Type: text/xml\n\n" , boundaryString);
            var closeBoundary = java.lang.String.format("\n\n--%s--\n", boundaryString);
    
            // var netIPSocketAddress = java.net.InetSocketAddress("127.0.0.1", 8888);
            // var proxy = java.net.Proxy(java.net.Proxy.Type.HTTP , netIPSocketAddress);
            // var urlConnection = serverUrl.openConnection(proxy);
            var urlConnection = serverUrl.openConnection();
    
            urlConnection.setDoOutput(true); // Indicate that we want to write to the HTTP request body
            urlConnection.setRequestMethod("POST");
            //urlConnection.addRequestProperty("Authorization", "Basic " + Authorization);
            urlConnection.addRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundaryString);
    
    
            var outputStreamToRequestBody = urlConnection.getOutputStream();
    
            outputStreamToRequestBody.write(openBoundary.getBytes(java.nio.charset.StandardCharsets.UTF_8));
            outputStreamToRequestBody.write(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(FILE_URL_COLUMN)));
            outputStreamToRequestBody.write(closeBoundary.getBytes(java.nio.charset.StandardCharsets.UTF_8));
    
            outputStreamToRequestBody.flush();
    
    
            var httpResponseReader = new java.io.BufferedReader(new java.io.InputStreamReader(urlConnection.getInputStream()));
    
            var lineRead = "";
            var finalText = "";
            while((lineRead = httpResponseReader.readLine()) != null) {
                finalText += lineRead;
            }
    
            var status = urlConnection.getResponseCode();
            var result = finalText;
            var time   = new Date();
    
        }
        catch(e)
        {
            Alert(e);
        }
    

    【讨论】:

      【解决方案3】:

      我使用http://www.dietz-solutions.com/2017/06/pentaho-data-integration-multi-part.html的解决方案解决了这个问题

      谢谢本。

      他为多部分表单提交编写了一个 Java 类。我通过添加授权标头来扩展...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2017-09-14
        • 2015-07-07
        相关资源
        最近更新 更多