c#从客户端到服务器实时上传到AmazonS3
早上好,我有一个桌面应用程序,可以将文件上传到WCF服务,然后WCF服务上传到AmazonS3 这是我的WCF方法,它接收文件并上传到S3c#从客户端到服务器实时上传到AmazonS3,c#,wcf,amazon-s3,C#,Wcf,Amazon S3,早上好,我有一个桌面应用程序,可以将文件上传到WCF服务,然后WCF服务上传到AmazonS3 这是我的WCF方法,它接收文件并上传到S3 public void UploadFile(RemoteFileInfo request) { config = new AmazonS3Config(); config.CommunicationProtocol = Protocol.HTTP; accessKeyI
public void UploadFile(RemoteFileInfo request)
{
config = new AmazonS3Config();
config.CommunicationProtocol = Protocol.HTTP;
accessKeyID = "XXXXXXX";
secretAccessKeyID = "YYYYYYYY";
client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID, secretAccessKeyID, config);
int chunkSize = 2048;
byte[] buffer = new byte[chunkSize];
using (System.IO.MemoryStream writeStream = new System.IO.MemoryStream())
{
do
{
// read bytes from input stream
int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize);
if (bytesRead == 0) break;
// simulates slow connection
System.Threading.Thread.Sleep(3);
// write bytes to output stream
writeStream.Write(buffer, 0, bytesRead);
} while (true);
// report end
Console.WriteLine("Done!");
// start the uploading to S3
PutObjectRequest fileRequest = new PutObjectRequest();
fileRequest.WithInputStream(writeStream);
fileRequest.Key = "testfile.pdf";
fileRequest.WithBucketName("tempbucket");
fileRequest.CannedACL = S3CannedACL.Private;
fileRequest.StorageClass = S3StorageClass.Standard;
client.PutObject(fileRequest);
writeStream.Close();
}
}
在我的客户机上,当我将文件上传到WCF服务时,我会实时获得进度,但当我获得100%的完成率时,这并不意味着文件已经上传到S3,因此我想知道在我写流时是否可能将文件上传到S3(在服务器内部)
(System.IO.MemoryStream writeStream = new System.IO.MemoryStream())
{
这可能吗?关于如何做有什么指导方针吗
提前欣赏。您可以使用的InputStream属性
public void UploadFile(RemoteFileInfo request)
{
config = new AmazonS3Config();
config.CommunicationProtocol = Protocol.HTTP;
accessKeyID = "XXXXXXX";
secretAccessKeyID = "YYYYYYYY";
client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID,secretAccessKeyID,config);
int chunkSize = 2048;
byte[] buffer = new byte[chunkSize];
PutObjectRequest fileRequest = new PutObjectRequest();
fileRequest.Key = "testfile.pdf";
fileRequest.WithBucketName("tempbucket");
fileRequest.CannedACL = S3CannedACL.Private;
fileRequest.StorageClass = S3StorageClass.Standard;
using (fileRequest.InputStream = new System.IO.MemoryStream())
{
do
{
// read bytes from input stream
int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize);
if (bytesRead == 0) break;
// simulates slow connection
System.Threading.Thread.Sleep(3);
// write bytes to output stream
fileRequest.InputStream.Write(buffer, 0, bytesRead);
} while (true);
// report end
Console.WriteLine("Done!");
client.PutObject(fileRequest);
}
}
我建议将文件作为块而不是流上载到WCF。我这样做了,效果很好。此外,您需要返回一条消息,说明稍后写入amazon的实际字节数。您可以在此基础上增加进度条。我知道这将导致您在客户端应用程序中编写while循环,但这将帮助您对于大文件,您的WCF函数应该采用如下参数
[DataContract]
class RemoteFileInfo
{
[DataMember]
Byte[] myChunk;
[DataMember]
long myOffset;
// other stuff you think you need to be sent each time.
}
不幸的是,您的问题有点不清楚(至少对我来说是这样)。您的客户端如何实时显示进度?WCF有一个功能用于此。这可以工作,但仍然存在相同的问题。客户端知道文件已经开始上载到服务器,但当您调用client.PutObject(fileRequest)时因为在do-while之外,所以必须等待服务器将该流上传到S3。do-it Async..我认为会得到相同的结果。我必须在do-while内部开始上传…我发现了以下内容:使用Multipart uploadhere关于multi-upload的文档:如何发送块而不是流?但是Amazon S3支持上传吗oad chunk bytes?它与Amazon S3无关,使用WCF类RemoteFileInfo删除流数据成员并添加另一个数据成员,该数据成员应为字节数组。此外,还需要另一个数据成员作为偏移量。