C# DropBox API调用上载零字节文件
我尝试使用rest调用将文件上载到dropbox,但它并没有上载实际文件,而是上载了一个零字节的文件 请检查代码,如果我遗漏了什么,请告诉我C# DropBox API调用上载零字节文件,c#,rest,api,dropbox,C#,Rest,Api,Dropbox,我尝试使用rest调用将文件上载到dropbox,但它并没有上载实际文件,而是上载了一个零字节的文件 请检查代码,如果我遗漏了什么,请告诉我 var task = Task.Run((Func<Task<int>>)OrderExtractUsecase.DropBox); task.Wait(); int x = task.Result; var task=task.Run((Func)OrderExtractUsecase.DropBox); task.Wait()
var task = Task.Run((Func<Task<int>>)OrderExtractUsecase.DropBox);
task.Wait();
int x = task.Result;
var task=task.Run((Func)OrderExtractUsecase.DropBox);
task.Wait();
INTX=任务。结果;
Dropbox任务代码为:
static async Task<int> DropBox()
{
try
{
Dropbox_Utility objDropBox = new Dropbox_Utility("<accessid>");
foreach (string temp in fileList)
{
await objDropBox.Upload("/Assist", temp);
}
return 1;
}
catch(Exception ex)
{
return -1;
}
}
静态异步任务DropBox()
{
尝试
{
Dropbox_实用程序objDropBox=新Dropbox_实用程序(“”);
foreach(文件列表中的字符串临时值)
{
等待objDropBox.Upload(“/Assist”,temp);
}
返回1;
}
捕获(例外情况除外)
{
返回-1;
}
}
上传任务代码为:
public async Task<string> Upload(string folder, string filefullpath)
{
string filename = string.Empty;
string fileID = string.Empty;
try
{
filename = Path.GetFileName(filefullpath);
using (FileStream fileStream = File.OpenRead(filefullpath))
{
using (MemoryStream memoryStream = new MemoryStream())
{
fileStream.CopyTo(memoryStream);
var response = await dbx.Files.UploadAsync(folder + "/" + filename, WriteMode.Overwrite.Instance, body: memoryStream);
fileID = response.Id;
}
}
}
catch (Exception ex) { throw; }
finally { }
return fileID;
}
公共异步任务上载(字符串文件夹、字符串文件完整路径)
{
字符串文件名=string.Empty;
string fileID=string.Empty;
尝试
{
filename=Path.GetFileName(filefullpath);
使用(FileStream FileStream=File.OpenRead(filefullpath))
{
使用(MemoryStream MemoryStream=new MemoryStream())
{
CopyTo(memoryStream);
var response=await dbx.Files.UploadAsync(文件夹+“/”+文件名,WriteMode.Overwrite.Instance,正文:memoryStream);
fileID=response.Id;
}
}
}
catch(异常ex){throw;}
最后{}
返回fileID;
}
如awh112所述,您需要重置内存流的位置。在copyTo
之后,memoryStream
的位置是文件的长度。因此,您的代码将上载一个零字节文件。我已经证实了以下几点:
fileStream.CopyTo(memoryStream);
Console.WriteLine(memoryStream.Position);
var response = await dbx.Files.UploadAsync(folder + "/" + filename, WriteMode.Overwrite.Instance, body: memoryStream);
Console.WriteLine((response as FileMetadata).Size);
打印:(在我的例子中,我的测试文件只有12字节长)
您可以像这样倒带它:
fileStream.CopyTo(memoryStream);
Console.WriteLine(memoryStream.Position);
memoryStream.Position = 0;
Console.WriteLine(memoryStream.Position);
var response = await dbx.Files.UploadAsync(folder + "/" + filename, WriteMode.Overwrite.Instance, body: memoryStream);
Console.WriteLine((response as FileMetadata).Size);
上面印着:
12
0
12
然后,生成的上载文件包含预期的内容。在复制之前,您可能需要重置流的位置。请参见此处的答案:@awh112不工作:(@gerg现在还没有上传文件,如果我使用的是secound peice of code当我使用上述代码时,下面是我得到的输出,2019880 0 2019880@Gerg@JiteshDammani您是如何检查的?您共享的输出表明memoryStream
确实收到了2019880
字节,并且uplo从Dropbox返回的FileMetadata.Size
证明,aded文件也是完整的2019880
。顺便说一句,除非您出于其他原因需要单独的MemoryStream
,否则您应该完全放弃它,直接从文件流上传即可。
12
0
12