【问题标题】:How to add a file attachment via NodeJS REST request如何通过 NodeJS REST 请求添加文件附件
【发布时间】:2015-10-08 11:07:59
【问题描述】:

Jira 网站上有一些关于如何通过 curl 请求向问题添加附件的文档:https://confluence.atlassian.com/display/JIRAKB/How+to+attach+an+attachment+in+a+JIRA+issue+using+REST+API

这是我用来成功创建问题的代码:

var request = require("request");
var auth = "Basic " + new Buffer("user:password").toString("base64");
var options = {
  uri: 'http://domain.com/rest/api/2/issue/',
  headers : {
    "Authorization" : auth
  },
  method: 'POST',
  json: {
    "fields": {
       "project": {
           "id": "10000"
       },
       "summary": summary,
       "description": description,
       "issuetype": {
           "name": "Bug"
       },
       "customfield_10003": {"value": value}
    }
  }
};
request(options, function (error, response, body) {
  if (!error) {
    console.log("Success");
  }
});

因此,为了向 ID 为 1200 的票证添加附件,我想我会这样做:

var options = {
      uri: 'http://domain.com/rest/api/2/issue/1200/attachment/',
      headers : {
        "Authorization" : auth,
        "X-Atlassian-Token" : nocheck
      },
      method: 'POST',
      json: {
        "fields": {
            "file" : "filename.txt"
        }
      }
    };

但是没有运气。

编辑:到达某个地方。这是我得到的:

var request = require('request');
var fs = require("fs");
var auth = "Basic " + new Buffer("user:password").toString("base64");
var formData = {
  file: {
    value:  fs.createReadStream('file.txt'),
    options: {
      filename: 'file.txt',
      contentType: 'text/plain'
    }
  }
};
request.post({
  url:'http://domain.com/rest/api/2/issue/14000/attachments/', 
  headers : {
        "Authorization" : auth,
    "X-Atlassian-Token" : "nocheck"
      }, 
  formData: formData
}, function optionalCallback(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});

它会上传一个名为 file.txt 的文件,但是当我查看附件时,它会打印出一个堆栈跟踪,开头是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><status><status-code>500</status-code><stack-trace>java.lang.NullPointerException&#xD;
    at com.atlassian.plugins.rest.common.security.jersey.XsrfResourceFilter.mediaTypeToString(XsrfResourceFilter.java:91)&#xD;
    at com.atlassian.plugins.rest.common.security.jersey.XsrfResourceFilter.isXsrfable(XsrfResourceFilter.java:76)&#xD;
    at com.atlassian.plugins.rest.common.security.jersey.XsrfResourceFilter.filter(XsrfResourceFilter.java:54)&#xD;
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:277)&#xD;
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)&#xD;
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)&#xD;
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)&#xD;
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)&#xD;
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)&#xD;
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)&#xD;
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)&#xD;
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)&#xD;
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)&#xD;

【问题讨论】:

标签: node.js api rest jira


【解决方案1】:

你先试试:

var options = {
      uri: 'http://domain.com/rest/api/2/issue/1200/attachment/',
      headers : {
        "Authorization" : auth,
        "X-Atlassian-Token" : nocheck
      },
      method: 'POST',
      json: {
        "fields": {
            "file" : "filename.txt"
        }
      }
    };

将不起作用,因为它不受支持。检查Jira attachment documentation

因此,您可能需要将 formData 对象重组为

var formData = {
  file: fs.createReadStream('file.txt'),
};

如果您不需要元数据,则无需编辑它们。还要确保你有一个有效的文件流。

关于堆栈跟踪,我看到与 XSRF 相关的堆栈帧,尽管添加了对我没有任何意义的“X-Atlassian-Token”标头。

【讨论】:

    猜你喜欢
    • 2013-07-15
    • 2013-08-20
    • 1970-01-01
    • 2012-01-24
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2016-06-02
    相关资源
    最近更新 更多