public static void Upload(Stream stream, String objectName)
        {
            S3Service service = GetService();

            long len = stream.Position;

            stream.Seek(0, SeekOrigin.Begin);

            AddObjectRequest req = new AddObjectRequest(service, Program.Config.BucketName, objectName)
            {
                CannedAcl     = CannedAcl.PublicRead,
                ContentType   = "image/" + Program.Config.ImageType,
                ContentLength = len
            };

            IAsyncResult uploadAsync = req.BeginGetRequestStream(a =>
            {
                using (Stream outStream = req.EndGetRequestStream(a))
                {
                    try
                    {
                        var buffer   = new byte[len > 65536 ? 65536 : len];
                        var position = 0;
                        while (position < stream.Length)
                        {
                            var read = stream.Read(buffer, 0, buffer.Length);
                            outStream.Write(buffer, 0, read);
                            position += read;
                        }
                        outStream.Flush();

                        stream.Close();
                        stream.Dispose();
                        stream = null;
                        buffer = null;

                        using (AddObjectResponse response = req.GetResponse())
                        {
                            string url = null;
                            if (Program.Config.CloudFront != null && Program.Config.CloudFront.Length > 0)
                            {
                                url = "http://" + Program.Config.CloudFront + "/" + objectName;
                            }
                            else
                            {
                                url = "http://" + Program.Config.Region + "/" + Program.Config.BucketName + "/" + objectName;
                            }
                            FormMain.DefaultInstance.Invoke((MethodInvoker) delegate
                            {
                                FormMain.DefaultInstance.UploadComplete(url);
                            });
                        }
                    }
                    catch (Exception e)
                    {
                        FormMain.DefaultInstance.Invoke((MethodInvoker) delegate
                        {
                            FormMain.DefaultInstance.UploadFailed();
                        });
                    }
                    finally
                    {
                        //GC.Collect();
                    }
                }
            }, null);
        }
        public static void Upload(Stream stream)
        {
            S3Service service = GetService();

            string objectName = Program.Config.ObjectPrefix + DateTime.Now.Ticks / TimeSpan.TicksPerSecond + "." + Program.Config.ImageType.ToLower();

            long len = stream.Position;
            stream.Seek(0, SeekOrigin.Begin);

            AddObjectRequest req = new AddObjectRequest(service, Program.Config.BucketName, objectName)
            {
                CannedAcl = CannedAcl.PublicRead,
                ContentType = "image/" + Program.Config.ImageType,
                ContentLength = len
            };

            IAsyncResult uploadAsync = req.BeginGetRequestStream(a =>
            {
                using (Stream outStream = req.EndGetRequestStream(a))
                {
                    try
                    {
                        var buffer = new byte[len > 65536 ? 65536 : len];
                        var position = 0;
                        while (position < stream.Length)
                        {
                            var read = stream.Read(buffer, 0, buffer.Length);
                            outStream.Write(buffer, 0, read);
                            position += read;
                        }
                        outStream.Flush();

                        stream.Close();
                        stream.Dispose();
                        stream = null;
                        buffer = null;

                        using (AddObjectResponse response = req.GetResponse())
                        {
                            string url = null;
                            if (Program.Config.CloudFront != null && Program.Config.CloudFront.Length > 0)
                            {
                                url = "http://" + Program.Config.CloudFront + "/" + objectName;
                            }
                            else
                            {
                                url = "http://" + Program.Config.Region + "/" + Program.Config.BucketName + "/" + objectName;
                            }
                            FormMain.DefaultInstance.Invoke((MethodInvoker)delegate
                            {
                                FormMain.DefaultInstance.UploadComplete(url);
                            });
                        }
                    }
                    catch (Exception e)
                    {
                        FormMain.DefaultInstance.Invoke((MethodInvoker)delegate
                        {
                            FormMain.DefaultInstance.UploadFailed();
                        });
                    }
                    finally
                    {
                        //GC.Collect();
                    }
                }
            }, null);
        }