web-dev-qa-db-ja.com

C#RestSharpとDrupalサービスを使用して投稿にファイルを添付

Drupalに投稿するC#アプリを作成しています。サービスモジュールへのRest呼び出しを使用すると、簡単に接続して新しいノードを作成できますが、ファイルをノードに添付する方法がわかりません。 C#用のRestSharpライブラリ。これはコードです。

var request = new RestRequest("...node/12/attach_file.json", Method.POST);
request.RequestFormat = RestSharp.DataFormat.Json;
request.AddCookie(my_session_name, my_sessid);
request.AddHeader("X-CSRF-Token", restResponse.Data.token);
request.AddParameter("field_name", "field_done");
request.AddFile("file", @"C:\pathtomyfile.png");
var response = client.Execute(request);

エラーは返されず、ステータスは200ですが、応答は空であり、Drupalには何もアップロードされません。ちなみにノードの日付は変更されているように見えるので、何かがうまくいきました...!

RestSharpのAddFileメソッドはマルチパートであるため、Drupalのattach_file:

ファイルをノードにアップロードして添付します。 POST multipart/form-data to node/123/attach_file

何か助けは?

1
teocomi

私はこの方法でそれを理解しました、答えを遅く投稿して申し訳ありません:

// FIRST LOGIN
var client = new RestClient("http://....../");
var request = new RestRequest("user/login.json", Method.POST);
request.AddHeader("Content-Type", "x-www-form-urlencoded");
request.AddParameter("username", username);
request.AddParameter("password", password);
var restResponse = client.Execute<Login>(request);

次に画像をアップロードします。

public string UploadPic(string path, Login login)
{
    var request = new RestRequest("file.json", Method.POST);
    request.RequestFormat = RestSharp.DataFormat.Json;
    request.AddCookie(login.session_name, login.sessid);
    request.AddHeader("X-CSRF-Token", login.token);
    request.AddParameter("uid", login.user.uid);
    string filevalue = System.Convert.ToBase64String(file_get_byte_contents(path));
    request.AddParameter("file", filevalue);
    request.AddParameter("filename", path.Split(new Char[] { '\\', '/' }).Last());
    var response = client.Execute<DFile>(request);

    return response.Data.fid;
}

static byte[] file_get_byte_contents(string fileName)
{
    byte[] sContents;
    if (fileName.ToLower().IndexOf("http:") > -1)
    {
        // URL 
        System.Net.WebClient wc = new System.Net.WebClient();
        sContents = wc.DownloadData(fileName);
    }
    else
    {
        // Get file size
        FileInfo fi = new FileInfo(fileName);

        // Disk
        FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);
        sContents = br.ReadBytes((int)fi.Length);
        br.Close();
        fs.Close();
    }

    return sContents;
}

クラスLoginとDFileは次のとおりです。

public class DFile
{
    public string fid { get; set; }
    public string uid { get; set; }
    public string filename { get; set; }
    public string uri { get; set; }
    public string filemime { get; set; }
    public string filesize { get; set; }
    public string status { get; set; }
    public string timestamp { get; set; }
}
public class Login
{
    public string sessid { get; set; }
    public string session_name { get; set; }
    public string token { get; set; }
    public User user { get; set; }
}
0
teocomi