繁体   English   中英

WP8上传文件

[英]WP8 Upload file

我正在尝试通过C#Windows Phone 8.1应用程序上的网站API上传文件。 我想使用Windows.Web.Http lib。 我可以选择一个带有FilePicker的文件(fileChoosenFromFilePicker var)。

错误我每次都收到http 400(错误请求)错误。

问题有人可以帮助我吗? 如何查看我的代码生成的POST请求? 我可以在服务器端捕获数据包,但我想在客户端看到。

在API文档中,有一个示例:

curl -H "Authorization: Token f2210dacd9c6ccb8133606d94ff8e61d99b477fd" -F file=@test.txt -F filename=test.txt -F parent_dir=/ http://cloud.seafile.com:8082/upload-api/ef881b22

这是我的代码:

 var HttpClientUpload = new HttpClient();
 HttpMultipartContent requestUpload = new HttpMultipartContent();
 HttpMultipartFormDataContent requestUploadContent = new HttpMultipartFormDataContent();

var fileContent = await fileChoosenFromFilePicker.OpenReadAsync();

        HttpFormUrlEncodedContent requestUploadData = new HttpFormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("filename", fileChoosenFromFilePicker.Name),
                    new KeyValuePair<string, string>("parent_dir", "/")
                });

        HttpClientUpload.DefaultRequestHeaders.Add("Authorization", "token " + authorization);

         IInputStream inputStream = await fileChoosenFromFilePicker.OpenAsync(FileAccessMode.Read);
        requestUploadContent.Add(new HttpStreamContent(inputStream), "myFile", fi.Name);

           try
        {
            HttpResponseMessage response = await HttpClientUpload.PostAsync(uristringForUpload, requestUpload);
            response.EnsureSuccessStatusCode();
        }
        catch (Exception ex)
        {

        }

编辑

我使用了您的代码。 并进行了一些更改:

var HttpClientUpload = new HttpClient(filter);
        HttpMultipartFormDataContent requestUploadContent = new HttpMultipartFormDataContent();

        var fileContent = await fileChoosenFromFilePicker.OpenReadAsync();

        HttpClientUpload.DefaultRequestHeaders.Add("Authorization", "token " + authorization);

        FileInfo fi = new FileInfo(fileChoosenFromFilePicker.Path);
        string fileName = fi.Name;         

        var inputStream = await fileChoosenFromFilePicker.OpenAsync(FileAccessMode.Read);
        requestUploadContent.Add(new HttpStreamContent(inputStream), "myFile", fi.Name);

        var values = new[]
                {
                    new KeyValuePair<string, string>("filename", fileName),
                    new KeyValuePair<string, string>("parent_dir", "/")
                };

        foreach (var keyValuePair in values)
        {
            requestUploadContent.Add(new HttpStringContent(keyValuePair.Value), keyValuePair.Key);
        }


        try
        {
            HttpResponseMessage responseLogin = await HttpClientUpload.PostAsync(uristringForUpload, requestUploadContent);
            responseLogin.EnsureSuccessStatusCode();

        }
        catch (Exception ex)
        {

        }

现在好了。 但是,它仍然无法正常工作。

在这里您可以找到POST结果: http ://requestb.in/p5jvlfp5?inspect#13hh5o

如果我用卷发制成,则会得到以下结果: http : //requestb.in/pwng8npw?inspect

在我的版本中,POST结果中没有“ Content-Type:应用程序/八位位组流”。 我该如何指定呢? 或者可能是HttpStreamContent问题?

据我所知,您不是将所有这些信息组合在一起。 到实际的PostAsync()调用时,您将沿着HttpMultipartContent类型的完全空的包进行发送。 您确定变量requestUpload的尺寸,然后除了发布变量外,什么也不做。

尝试通过创建外部HttpMultipartFormDataContent对象来组成请求,您将在其中添加HttpStreamContent和HttpFormUrlEncodedContent对象,如下所示。 我已经尝试过最好的重新创建,以便确定Seafile的python上传方法文档中的请求所要求的服务器。

var client = new HttpClient();

var request = new HttpMultipartFormDataContent();
request.Headers.Add("Authorization", "Token " + authorization);

// Add file content request part
var fileContent = await fileChosenFromFilePicker.OpenAsync(FileAccessMode.Read);
var requestContent = new HttpStreamContent(fileContent);
requestContent.Headers.Add("Content-Type", "application/octet-stream");
request.Add(requestContent, "file", fileChosenFromFilePicker.Name);

// Add form data request part
request.Add(new HttpFormUrlEncodedContent(new Dictionary<string, string>
{
    {"parent_dir", "/"}
}));

try
{
    // Submit multipart request object
    var response = await client.PostAsync(new Uri(uriStringForUpload), request);
    response.EnsureSuccessStatusCode();
}
catch (Exception ex)
{
    // TODO
}   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM