[英]RestSharp AddFile Using Stream
我正在使用 RestSharp(Visual Studio 2013 中的版本 105.2.3.0,.net 4.5)来调用 NodeJS 托管的 Web 服务。 我需要进行的调用之一是上传文件。 使用 RESTSharp 请求,如果我将流从我的一端检索到一个字节数组并将其传递给 AddFile,它就可以正常工作。 但是,我更愿意流式传输内容而不是在服务器内存中加载整个文件(文件可以是 100 MB)。
如果我设置了一个操作来复制我的流(见下文),我会在 System.Net.ProtocolViolationException 的“MyStream.CopyTo”行出现异常(要写入流的字节数超过了指定的 Content-Length 字节大小) . 此异常在调用 client.Execute 后在 Action 块中抛出。
从我读到的内容来看,我不应该手动添加 Content-Length 标头,如果我这样做也无济于事。 我曾尝试将 CopyTo 缓冲区设置得太小和太大,以及完全忽略它,但无济于事。 有人可以告诉我我错过了什么吗?
// Snippet...
protected T PostFile<T>(string Resource, string FieldName, string FileName,
string ContentType, Stream MyStream,
IEnumerable<Parameter> Parameters = null) where T : new()
{
RestRequest request = new RestRequest(Resource);
request.Method = Method.POST;
if (Parameters != null)
{
// Note: parameters are all UrlSegment values
request.Parameters.AddRange(Parameters);
}
// _url, _username and _password are defined configuration variables
RestClient client = new RestClient(_url);
if (!string.IsNullOrEmpty(_username))
{
client.Authenticator = new HttpBasicAuthenticator(_username, _password);
}
/*
// Does not work, throws System.Net.ProtocolViolationException,
// Bytes to be written to the stream exceed the
// Content-Length bytes size specified.
request.AddFile(FieldName, (s) =>
{
MyStream.CopyTo(s);
MyStream.Flush();
}, FileName, ContentType);
*/
// This works, but has to load the whole file in memory
byte[] data = new byte[MyStream.Length];
MyStream.Read(data, 0, (int) MyStream.Length);
request.AddFile(FieldName, data, FileName, ContentType);
var response = client.Execute<T>(request);
// check response and continue...
}
我遇到过同样的问题。 我最终在 Files 集合上使用了 .Add() 。 它有一个与 AddFile() 具有相同参数的 FileParameter 参数,您只需要添加 ContentLength:
var req = GetRestRequest("Upload", Method.POST, null);
//req.AddFile("file",
// (s) => {
// var stream = input(imageObject);
// stream.CopyTo(s);
// stream.Dispose();
// },
// fileName, contentType);
req.Files.Add(new FileParameter {
Name = "file",
Writer = (s) => {
var stream = input(imageObject);
stream.CopyTo(s);
stream.Dispose();
},
FileName = fileName,
ContentType = contentType,
ContentLength = contentLength
});
以下示例 - 如何使用预签名URL将映像文件上载到Amazon S3存储桶。 RestSharp库。
public void UploadToS3PresignedUrl(string s3presignedUrl, byte[] imageByte)
{
var request = new RestRequest(s3presignedUrl, Method.PUT);
request.AddHeader("Content-Type", "image/jpeg");
request.AddParameter("application/octet-stream", imageByte, ParameterType.RequestBody);
var client = new RestClient();
client.Execute(request);
}
以下代码适用于我使用 rest Sharp 上传 csv 文件。 已调用 Web 服务 API。
var client = new RestClient(<YOUR API END URL >);
var request = new RestRequest(Method.POST) ;
request.AlwaysMultipartFormData = true;
request. AddHeader("Content-Type", "multipart/form-data");
request.AddHeader("X-API-TOKEN", <Your Unique Token - again not needed for certain calls>);
request.AddParameter(<Your parameters.....>);
request.AddFile("file", currentFileLocation, contentType);
request.AddParameter("multipart/form-data", fileName, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
var response = client.Execute(request);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.