我通过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)获得的。 我尝试了卷曲,一切正常。
代码出了什么问题。还有什么我需要考虑的吗?
答案 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} /附件
希望这有助于您的情况。