簡體   English   中英

Windows Phone 8 FtpClient不會上載以前用於BitmapImage的流數據

[英]Windows Phone 8 FtpClient won't upload stream data previously used for issue with BitmapImage

我將盡力清楚地解釋這個問題。 我正在使用來自的代碼

http://msdn.microsoft.com/en-us/magazine/dn385710.aspx

創建照片共享應用。 我可以將圖像FTP傳輸到我的服務器上。 我面臨的問題是當我嘗試創建該應用程序以預覽圖片然后通過FTP傳輸它時。 FTP仍將傳輸文件,但是文件大小始終為0。 我不確定這是否是錯誤,或者不確定我是否在FTP之前未處置某個對象。 以下是我的代碼:

第1頁

BitmapImage bitmapImage;

public PhotoPreview()
{
    InitializeComponent();

    btnYes.Tap += btnYes_Tap;

    imgPreview.Width = G.getScreenWidth();
    imgPreview.Height = G.getScreenHeight() - 250;

    //windows phone 8 bug. When bitmap image is set...it blocks the FTP process thread. Will perform FTP on seperate page
    previewPhoto();
}

void previewPhoto()
{
    bitmapImage = new BitmapImage();
    bitmapImage.SetSource(G.myStream);
    imgPreview.Source = bitmapImage;
}

private void btnYes_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    disposeImage(bitmapImage);

    NavigationService.Navigate(new Uri("/PhotoFTP.xaml", UriKind.Relative));
}

private void disposeImage(BitmapImage img)
{
    if (img != null)
    {
        try
        {
            using (var ms = new MemoryStream(new byte[] { 0x0 }))
            {
                img = new BitmapImage();
                img.SetSource(ms);
            }
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.WriteLine("ImageDispose FAILED " + e.Message);
        }
    }
}

第2頁

const string 
    IP_ADDRESS = "888.88.888",
    FTP_USERNAME = "test",
    FTP_PASSWORD = "test123"
    ;

string filename;

FtpClient ftpClient = null;
TestLogger logger = null;

public PhotoFTP()
{
    InitializeComponent();

    DateTime thisDay = DateTime.Today;
    string timestamp = thisDay.Hour.ToString() + "_" + thisDay.Minute.ToString() + "_" + thisDay.Second.ToString();
    filename = timestamp + ".jpg";
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    Test_connect();
}

private async void Test_connect()
{
    logger = TestLogger.GetDefault(this.Dispatcher);
    lstLogs.ItemsSource = logger.Logs;

    ftpClient = new FtpClient(IP_ADDRESS, this.Dispatcher);

    ftpClient.FtpConnected += ftpClient_FtpConnected;
    ftpClient.FtpFileUploadSucceeded += ftpClient_FtpFileUploadSucceeded;
    ftpClient.FtpFileUploadFailed += ftpClient_FtpFileUploadFailed;
    ftpClient.FtpAuthenticationSucceeded += ftpClient_FtpAuthenticationSucceeded;
    ftpClient.FtpAuthenticationFailed += ftpClient_FtpAuthenticationFailed;

    logger = TestLogger.GetDefault(this.Dispatcher);

    await ftpClient.ConnectAsync();

    logger.AddLog("Connecting...");
}

async void ftpClient_FtpConnected(object sender, EventArgs e)
{
    logger.AddLog("Preparing...");
    await (sender as FtpClient).AuthenticateAsync(FTP_USERNAME, FTP_PASSWORD);
}

private async void Test_upload()
{
    logger.AddLog("Uploading photo...");
    await ftpClient.UploadFileAsync(G.myStream, "username_timestamp.jpg");
}

void ftpClient_FtpAuthenticationFailed(object sender, EventArgs e)
{
    logger.AddLog("Connection error.");
}

void ftpClient_FtpAuthenticationSucceeded(object sender, EventArgs e)
{
    logger.AddLog("Connection established.");
    Test_upload();
}

void ftpClient_FtpFileUploadFailed(object sender, FtpFileTransferFailedEventArgs e)
{
    logger.AddLog("Failed.");
}

Boolean firstTime = true;
void ftpClient_FtpFileUploadSucceeded(object sender, FtpFileTransferEventArgs e)
{
    logger.AddLog("Completed.");
}

如果我注釋掉行previewPhoto(); 在第1頁中,它將通過FTP將文件發送到我的服務器。 我相信問題是

bitmapImage.SetSource(G.myStream);

我還嘗試創建兩個單獨的流。 一個用於預覽照片,另一個用於FTP。 當FTP到我的服務器時,結果仍然導致文件大小為0。

這是因為BitmapImage讀取到流的末尾,因此FtpClient沒有要讀取/上傳的數據。

使用Stream.Seek將流指針重設回開頭。

G.myStream.Seek(0, SeekOrigin.Begin);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM