JIRA Rest API调用返回"请求被拒绝,因为没有找到多部分边界"通过ajax调用发布附件

时间:2017-03-17 12:42:20

标签: jquery ajax html5-canvas jira-rest-api

我通过ajax调用发布了对JIRA rest api的附件,但它在#34中失败;请求被拒绝,因为没有找到多部分边界"。我按照jira doc上提供的说明进行操作,但仍面临此问题。这是代码剪辑:

  File "/root/anaconda3/bin/pip", line 11, in <module>
    load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
  File "/root/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 565, in load_entry_point
  File "/root/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2598, in load_entry_point
  File "/root/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2258, in load
  File "/root/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2264, in resolve
  File "/root/anaconda3/lib/python3.6/site-packages/pip-1.5.4-py3.6.egg/pip/__init__.py", line 9, in <module>
    from pip.log import logger
  File "/root/anaconda3/lib/python3.6/site-packages/pip-1.5.4-py3.6.egg/pip/log.py", line 9, in <module>
    from pip._vendor import colorama, pkg_resources
  File "/root/anaconda3/lib/python3.6/site-packages/pip-1.5.4-py3.6.egg/pip/_vendor/pkg_resources.py", line 1423, in <module>
    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'

这里imageDataUrl是从html canvas方法asDataUrl(canvas)获得的。 我尝试了卷曲,一切正常。

代码出了什么问题。还有什么我需要考虑的吗?

2 个答案:

答案 0 :(得分:1)

经过几次打嗝后,我想出了将附件发布到jira的方法。在将base64图像直接传递给jira之前,需要完成一些工作。 这是我最终的代码版本。

                            var blob = BG.dataURItoBlob(items.screenshotImg);
                            var fd = new FormData();
                            fd.append("file", blob);
                            fd.append('comment', "img");
                            fd.append('minorEdit', "true");

                            $.ajax({
                                url: "https://"+jiraUrl+"/rest/api/2/issue/"+issueKeyid+"/attachments",
                                type: 'POST', 
                                data: fd,
                                processData: false,
                                contentType: false,
                                headers: {
                                    "X-Atlassian-Token": "nocheck"
                                },
                                success: function(data) {
                                    status = "success";
                                    console("success");

                                },
                                error:function(data){
                                    status = "failed";
                                    console("Something went wrong !!");
                                }
                            });

这里我首先将base64图像url转换为blob数据,然后将其作为FormData对象作为整体发送到服务器。

//base64 to blob data
function dataURItoBlob(dataURI) {
    // convert base64/URLEncoded data component to raw binary data held in a string
    var byteString;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(dataURI.split(',')[1]);
    else
        byteString = unescape(dataURI.split(',')[1]);

    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

    // write the bytes of the string to a typed array
    var ia = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    return new Blob([ia], {type:mimeString});
},

答案 1 :(得分:0)

对于迟到的回复感到抱歉。

您可能需要更改分配[$ .ajax]方法的方式。您可以传递要从服务器端获取的整个附件文件(例如PHP),而不是传递base 64 url​​图像,您可以使用[curl]发布附件。

假设您已将[文件输入]放在[form] DOM元素

<form id="frm-upload" name="frm_upload" enctype="multipart/form-data">
    <input type="text" name="input_text" />
    <input type="file" name="input_upload_file" />
</form>

<a class="upload"> Upload </a>

然后在你的[ajax]回调中

$(sElement).click(function(event) {
     event.preventDefault();
     var oFormData = new FormData($('#frm-upload')[0]); // Assuming this is your form
     $.ajax({
         url: '/dashboard/upload',
         type: 'POST',
         data: oFormData,
         contentType: false,
         processData: false,
         beforeSend: function(xhr) {
             xhr.setRequestHeader("Authorization", "Basic " + btoa('username' + ":" + 'password'));
             xhr.setRequestHeader("X-Atlassian-Token","no-check");
                },
         success : function(response) {
             console.log(response);
         }
    }, 'json');
});

然后你可以用PHP获取上传的文件:

protected function upload()
{
    var_dump($_FILES); exit;
}

您可以从中获得结果:

array(1) {
["input_upload_file"]=>
    array(5) {
    ["name"]=>
    string(12) "service6.png"
    ["type"]=>
    string(9) "image/png"
    ["tmp_name"]=>
    string(14) "/tmp/php0bYNIY"
    ["error"]=>
    int(0)
    ["size"]=>
    int(1169)
  }
}

您可以使用[curl]执行此操作:

curl -D- -u admin:admin -X POST -H "X-Atlassian-Token: no-check" -F   "file=@service6.png" http://example.atlassian.com/rest/api/2/issue/TEST-123/attachments

如Jira的帖子附件API中所述:

https://docs.atlassian.com/jira/REST/cloud/?_ga=1.22532412.681630190.1490518356#api/2/issue/ {issueIdOrKey} /附件

希望这有助于您的情况。