Fogbugz API - невозможно загрузить файл (реализация C#)
Я не могу загружать вложения, используя API-интерфейс fogbugz. Я следовал за документацией fogbugz, но, возможно, я что-то не так. Произошла ошибка: Ex.Message = "Указанный ключ не присутствовал в словаре."
StackTrace = "at System.Collections.Generic.Dictionary2.get_Item(TKey key)
at UBR.Products.TimeTrakker.Client.Lib.FogBugz.FBApi.CallRESTAPIFiles(String sURL, Dictionary
2 rgArgs, словарь2[] rgFiles)
at UBR.Products.TimeTrakker.Client.Lib.FogBugz.FBApi.Cmd(String cmd, Dictionary
2 аргумента, словарь2[] files)
at Business.Services.Fogbugz.CreateBug(String title, String areaId, String summary, List
1 fileData) в c:\Dev\RapidAppsFogbugz\trunk\Business\Services\Fogbugz.cs: строка 114"
public string CreateBug(string title, string areaId, string summary)
{
try
{
string bugIdResult;
//Build args from Bug object
var args = FillArgsDictionaryForCreatingBug(title, GetDefaultProjectID(), areaId, summary);
var fileArgs = GetAttachmentArgs(GetAttachmentList());
//args.Add("nFileCount", "1");
if (fileArgs != null) //WITH ATTACHMENTS
bugIdResult = GetBugId(_fogbugz.Cmd("new", args, fileArgs));
else //NO ATTACHMENTS
bugIdResult = GetBugId(_fogbugz.Cmd("new", args));
return bugIdResult;
}
catch (Exception ex)
{
throw new Exception(typeof(Fogbugz).ToString() + " : Method = CreateBug", ex);
}
}
private List<byte[]> GetAttachmentList()
{
List<byte[]> fileData = null;
if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0)
{
fileData = new List<byte[]>();
for (int i = 0; i < Request.Files.Count; i++)
{
HttpPostedFileBase file = Request.Files[i];
if (file.ContentLength > 0)
{
using (var binaryReader = new BinaryReader(file.InputStream))
{
fileData.Add(binaryReader.ReadBytes(file.ContentLength));
}
}
}
}
private Dictionary<string, string> FillArgsDictionaryForCreatingBug(string title, string projectId, string areaId, string summary)
{
var args = new Dictionary<string, string>
{
{"sTitle", title},
{"ixProject", projectId},
{"ixArea", areaId},
{"sEvent", summary}
};
return args;
}
private Dictionary<string,byte[]>[] GetAttachmentArgs(List<byte[]> fileData)
{
Dictionary<string, byte[]>[] result = null;
if (fileData != null)
{
var fileArgs = new List<Dictionary<string, byte[]>>();
for (int i = 0; i < fileData.Count; i++)
{
var dictionary = new Dictionary<string, byte[]> { { "File" + (i+1).ToString(), fileData[i] } };
fileArgs.Add(dictionary);
}
result = fileArgs.ToArray();
}
return result;
}
1 ответ
Этим утром я боролся с той же ошибкой, но смог исправить ее, глядя на исходный код для FBApi.cs.
Короче говоря, код для загрузки файла полагается на конкретные ключи, которые должны присутствовать при загрузке файла, который нигде не был четко объяснен.
Вот эти ключи:
name
(То есть,File1
)filename
(путь к файлу на диске для загрузки - не требует пояснений)contenttype
(Я использовал,"multipart/form-data"
в соответствии с документацией FogBugz XML API)data
(т.е. фактическийbyte[]
содержимого файла).
Как только они были предоставлены, исключение исчезло, и мой тестовый файл был успешно загружен.
Для иллюстрации я включил пример моего рабочего кода ниже,
Dictionary<String, String> caseOptions = new Dictionary<String, String>();
Dictionary<String, Byte[]> PDF = new Dictionary<String,Byte[]>();
Dictionary<String, Byte[]>[] files = new Dictionary<String, Byte[]>[1];
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
// below will log into our FogBugz URL to use the FBApi
FogBugz.Init();
string fileName = @"C:\path\to\test.pdf";
// setup any necessary values
caseOptions.Add("sEvent", "Attaching PDF file");
caseOptions.Add("ixBug", "9999");
// setup required keys
PDF.Add("name", encoding.GetBytes("File1"));
PDF.Add("filename", encoding.GetBytes(fileName));
PDF.Add("contenttype", encoding.GetBytes("multipart/form-data"));
PDF.Add("data", File.ReadAllBytes(fileName));
files[0] = PDF;
FogBugz.fb.XCmd("edit", caseOptions, files);