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
何か助けは?
私はこの方法でそれを理解しました、答えを遅く投稿して申し訳ありません:
// 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; }
}