将文件上传到Windows 10应用程序c中的Pushbullet#
问题描述:
我目前使用Pushbullet API并需要上传文件。将文件上传到Windows 10应用程序c中的Pushbullet#
因为使用这种方法在docs规定我可以成功地得到一个上传网址:
public static async Task<Uploads> GetUploadUrl(string file_name, string file_type)
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Access-Token", AccessToken);
var json = new JObject
{
["file_name"] = file_name,
["file_type"] = file_type
};
var result = await client.PostAsync(new Uri(_uploadUrl, UriKind.RelativeOrAbsolute), new HttpStringContent(json.ToString(), UnicodeEncoding.Utf8, "application/json"));
if (result.IsSuccessStatusCode)
{
var textresult = await result.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<Uploads>(textresult);
}
}
return null;
}
问题是,当我尝试上传文件。我目前使用这种方法:
public static async Task<bool> UploadFile(StorageFile file, string upload_url)
{
try
{
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
var content = new MultipartFormDataContent();
if (file != null)
{
var streamData = await file.OpenReadAsync();
var bytes = new byte[streamData.Size];
using (var dataReader = new DataReader(streamData))
{
await dataReader.LoadAsync((uint)streamData.Size);
dataReader.ReadBytes(bytes);
}
var streamContent = new ByteArrayContent(bytes);
content.Add(streamContent);
}
client.DefaultRequestHeaders.Add("Access-Token", AccessToken);
var response = await client.PostAsync(new Uri(upload_url, UriKind.Absolute), content);
if (response.IsSuccessStatusCode)
return true;
}
catch { return false; }
return false;
}
但我得到一个HTTP 400错误。在UWP应用程序中使用multipart/form-data上传文件的正确方法是什么?
答
HTTP 400 error
表示错误请求,则意味着该请求无法被服务器因为语法错误的理解。换句话说,客户端发送的请求并不遵循服务器的规则。
让我们来看看document,我们可以在这个例子中找到要求它采用下列参数:
所以在要求,我们需要为上传的文件设置名称,名称应该是“文件”。另外,在这个请求中,不需要使用访问令牌。所以你可以改变你的代码如下:
public static async Task<bool> UploadFile(StorageFile file, string upload_url)
{
try
{
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
var content = new MultipartFormDataContent();
if (file != null)
{
var streamData = await file.OpenReadAsync();
var bytes = new byte[streamData.Size];
using (var dataReader = new DataReader(streamData))
{
await dataReader.LoadAsync((uint)streamData.Size);
dataReader.ReadBytes(bytes);
}
var streamContent = new ByteArrayContent(bytes);
content.Add(streamContent, "file");
}
//client.DefaultRequestHeaders.Add("Access-Token", AccessToken);
var response = await client.PostAsync(new Uri(upload_url, UriKind.Absolute), content);
if (response.IsSuccessStatusCode)
return true;
}
catch { return false; }
return false;
}
然后你的代码应该能够工作。您将收到204 No Content
响应,并且UploadFile
方法将返回true
。
太棒了,它现在有用!谢谢您的帮助 –