【问题标题】:Adding attachment to Jira via API通过 API 将附件添加到 Jira
【发布时间】:2015-03-20 16:55:31
【问题描述】:

我正在使用 Jira 的 API 将附件文件添加到案例中。我的问题是在我的代码附加文件之后,我去 JIRA 案例确认,我看到了两件事。首先,如果是图像,我可以看到图像的缩略图。但是,如果我单击它,我会收到一条错误消息“无法加载请求的内容。请重试。”其次,在缩略图下,不是显示文件名,而是显示文件最初上传的路径(id:c:/wamp/www/....),这是有原因的吗?这里是我的代码:

$ch = curl_init();
$header = array(
  'Content-Type: multipart/form-data',
   'X-Atlassian-Token: no-check'
);
$attachmentPath = $this->get_file_uploads();
//$attachmentPath comes out to be something like:
//c:/wamp/www/mySite/web/system/files/my_folder/DSC_0344_3.JPG

$data = array('file'=>"@". $attachmentPath, 'filename'=>'DSC_0344_3.JPG');
$url= 'https://mysite.atlassian.net/rest/api/2/issue/20612/attachments/';

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,  CURLOPT_POSTFIELDS ,$data);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");

$result = curl_exec($ch);
$ch_error = curl_error($ch);

将文件添加到 Jira 后,当我登录 Jira 时,我可以看到缩略图,但文件下的标题类似于:c:/wamp/www/mySite/web/system/files/my_folder/DSC_0344_3 .JPG 而不是文件名。

谢谢

【问题讨论】:

  • 我会说你的问题是这条线$data = array('file'=>"@". $attachmentPath, 'filename'=>'DSC_0344_3.JPG');通过HTTP协议以某种方式发送错误的数据。你能控制你的 Jira 服务器吗?
  • 我刚刚注意到的另一件事。您在哪里使用 $header 变量?也许它应该放在这里:curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 而不是 this->get_jira_headers()
  • 抱歉,复制时打错了。在我的代码中,我使用属性。我已经更正了这个错字。
  • 不,我无权访问 Jira 服务器。
  • 就像我说的,附件被添加了。它只是无法查看或下载。我认为这是因为它的链接没有标题,而是一条漫长的路径。

标签: php curl jira jira-rest-api


【解决方案1】:

对于未来的任何人:这是我编写的适用于 php 7 的函数

function attachFileToIssue($issueURL, $attachmentURL) {
// issueURL will be something like this: http://{yourdomainforjira}.com/rest/api/2/issue/{key}/attachments 
// $attachmentURL will be real path to file (i.e. C:\hereswheremyfilelives\fileName.jpg) NOTE: Local paths ("./fileName.jpg") does not work!

$ch = curl_init();
$headers = array(
    'X-Atlassian-Token: nocheck',
    'Content-type: multipart/form-data'
);

$cfile = new CURLFile($attachmentURL);
$cfile->setPostFilename(basename($attachmentURL));
$data = array("file" => $cfile);
curl_setopt_array(
    $ch,
    array(
        CURLOPT_URL => $issueURL,
        CURLOPT_VERBOSE => 1,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_USERPWD => "{username}:{password}"
    )
);
$result = curl_exec($ch);
$ch_error = curl_error($ch);
if ($ch_error)
    echo "cURL Error: " . $ch_error;

curl_close($ch);

}

【讨论】:

    【解决方案2】:

    你需要使用:

    $data = array('file'=>"@". $attachmentPath . ';filename=DSC_0344_3.JPG');
    

    这是 PHP cURL 5.2.10 中的一个问题,请参阅JIRA API attachment names contain the whole paths of the posted files

    当使用 PHP >= 5.5.0 时,最好切换到 CURLFile 方法,如该链接中所述。

    $cfile = new CURLFile($attachmentPath);
    $cfile->setPostFilename('DSC_0344_3.JPG');
    $data = array('file'=>$cfile);
    

    【讨论】:

    • 啊,那我就留给你吧:-)
    • 我只是把jira评论和php bug tracker的直接链接,stackoverflow.com/a/28124903/3933332
    • 谢谢!这行得通。不幸的是,我使用的是 PHP 5.0。 Curl 期望的数组似乎很敏感。即使是额外的空间也会导致问题。但是,这行得通!谢谢
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多