2011-10-17 32 views
0

这与我的previous question有关。 Wizard控件出现了一个无法预料的问题。向导控件中的文件上传,在末尾处理

我现在知道如何上传到FTP,然而使用时FileUpload控件向导控制,里面,当你移动到下一个步骤,该文件您选择得到,因为回传的清除。我需要能够在上传之前根据向导的结果重命名文件。所以......

  1. 我完成我的向导
  2. 它上传一些东西到数据库
  3. 根据这些结果重命名文件
  4. 上传重命名的文件到FTP服务器

我怀疑我需要按照这样的程序,在FileUpload旁边有一个上传按钮

  1. 在“上传”按钮上单击将文件流式传输到Web服务器。
  2. 完成向导。
  3. 如果向导成功完成,请将文件和流重命名为FTP服务器。
  4. 如果向导失败了,什么?从网络服务器上删除文件?怎么样?

我想我了解的过程,所以我想就如何我的FTP上传功能分为两个部分用正确的错误处理时,向导未能帮助。

如果您使用下面的代码作为基础,这将是一个很大的帮助。感谢一如既往:)

Protected Sub UploadFile(ByVal NewFilename As String) 
    Dim myFtpWebRequest As FtpWebRequest 
    Dim myFtpWebResponse As FtpWebResponse 

    'Function one? - Problem, "NewFilename" depends on the output of the Wizard, 
    '    but obviously it has not been called yet. 
    myFtpWebRequest = CType(WebRequest.Create(ftpServer + ftpPath + NewFilename), FtpWebRequest) 
    myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile 
    myFtpWebRequest.UseBinary = True 

    Dim myFileStream As Stream = FileUpload1.FileContent 
    myFtpWebRequest.ContentLength = myFileStream.Length 

    'Function two? 
    Dim requestStream As Stream = myFtpWebRequest.GetRequestStream() 
    myFileStream.CopyTo(requestStream) 
    requestStream.Close() 

    myFtpWebResponse = CType(myFtpWebRequest.GetResponse(), FtpWebResponse) 
    myFtpWebResponse.Close() 
End Sub 

- 答案---

这是我基于输入来自伊卡洛斯最终实现:)

为了简便起见我已经排除了错误捕获。该文件被上传到网络服务器

'This function is what kicks things off... 
Protected Sub UploadFileToWebServer() Handles btnUploadFile.Click 
    Dim TempDir As String = "C:\TEMP", FileName As String = "uploadedfile.tmp", FilePath As String 
    If Not Directory.Exists(TempDir) Then 
     Directory.CreateDirectory(TempDir).Attributes = FileAttributes.Directory 
    End If 
    FilePath = TempDir + "\" + FileName 
    Session.Add("FileName", File1.FileName) 'Keep track of uploaded file name 
    File1.SaveAs(FilePath) 
    Session.Add("File", FilePath) 
End Sub 

后,我们就可以继续通过该向导,点击“完成”按钮时,向导数据被提交到数据库。文件名基于插入的记录ID。插入记录后,通过点击“最终”按钮,下列函数被调用,并且该文件最终被上传到FTP服务器,文件名相应地发生了变化。

Protected Sub UploadFileToFtpServer(ByVal FileLinkStr As String) 
    Dim myFtpWebRequest As FtpWebRequest 
    Dim myFtpWebResponse As FtpWebResponse 

    'Defines the filename, path, and upload method, and connection credentials 
    myFtpWebRequest = CType(WebRequest.Create(ftpServer + ftpPath + FileLinkStr), FtpWebRequest) 
    'Be sure to authenticate prior to uploading or nothing will upload and no error 
    myFtpWebRequest.Credentials = New NetworkCredential(ftpUsername, ftpPassword) 
    myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile 
    myFtpWebRequest.UseBinary = True 

    'Streams the file to the FTP server 
    'Retrieves File temporarily uploaded to the Web Server during Wizard Processing 
    Dim iStream As New FileInfo(Session.Item("File")) 
    Dim myFileStream As Stream = iStream.OpenRead 
    myFtpWebRequest.ContentLength = myFileStream.Length 
    Dim requestStream As Stream = myFtpWebRequest.GetRequestStream() 
    myFileStream.CopyTo(requestStream) 
    requestStream.Close() 

    myFtpWebResponse = CType(myFtpWebRequest.GetResponse(), FtpWebResponse) 
    myFtpWebResponse.Close() 
End Sub 
+0

好,我很高兴它的作品! – Icarus

回答

1

您的理解是正确的。一旦将文件上传到Web服务器(您需要将它放在某个临时目录中并跟踪您提供的文件名),并且该向导成功完成,那么您将抓取该文件并相应地重命名并上传它到FTP服务器。如果失败,只需拨打:

File.Delete(Path_to_file_uploaded_on_temp_directory); 

例如,您可以通过将其存储在Session中来记录最初给出的文件名。当您最初将文件上传到服务器时,请执行以下操作:Session["FileName"]=Path_to_temp_directory+fileName;

在向导的最后一步中,从会话中获取文件名并重命名并将其上传到FTP服务器或将其删除。

当然,您需要考虑可能的名称冲突等。例如,您可以使用Guid为该文件生成随机名称。

我希望我解释清楚。

编辑

为了确保我正确地理解......

  1. 你需要你的用户去通过Wizard种事情
  2. 的所有步骤在这个过程中,你请您的用户上传文件。
  3. 因为用户必须在向导的最后一步之前选择一个文件,所以您必须立即上传文件,用户单击“下一步”按钮才能进入向导的下一步。
  4. 在向导的最后一步,您需要确定用户选择的文件是否应该上传到FTP服务器(大概是另一个与您的Web服务器不同的盒子),或者应该完全丢弃。
  5. 如果需要将文件上传到FTP服务器,需要使用特殊名称重命名该文件。

基于上述,我的建议是:

  1. 当用户点击,他从他的电脑中选择文件步骤“下一步”,需要立即将文件保存到一个临时位置在您的网络服务器。您可以通过做一些喜欢将文件保存到Web服务器上这个临时文件夹:

    if(FileUpload1.HasFile) //user selected a file 
    { 
        try 
        { 
         //D:\temp is a temp directory on the Web Server 
         FileUpload1.PostedFile.SaveAs(@"D:\temp\"+FileUpload1.FileName); 
         //Store the FULL PATH TO the file just uploaded on Session 
         Session["FileName"]="D:\temp\"+FileUpload1.FileName; 
        } 
        catch (Exception ex) 
        { 
         //Handle it. 
        } 
    } 
    
  2. 在向导的最后一步,假设一切顺利,这样做

    Dim myFtpWebRequest As FtpWebRequest 
    Dim myFtpWebResponse As FtpWebResponse 
    ' You know the NewFileName because it's the output of the wizard 
    
    myFtpWebRequest = CType(WebRequest.Create(ftpServer + ftpPath + NewFilename), FtpWebRequest) 
    myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile 
    myFtpWebRequest.UseBinary = True 
    
    'Here you need to read the Original File 
    Dim myFileStream As Stream = new FileStream(Session["FileName"]),FileMode.Open,FileAccess.Read,FileShare.ReadWrite) 
    myFtpWebRequest.ContentLength = myFileStream.Length 
    
    
    Dim requestStream As Stream = myFtpWebRequest.GetRequestStream() 
    myFileStream.CopyTo(requestStream) 
    requestStream.Close() 
    
    myFtpWebResponse = CType(myFtpWebRequest.GetResponse(), FtpWebResponse) 
    myFtpWebResponse.Close() 
    
  3. 如果您决定你应该删除用户上传的原始文件,因为他并没有成功地完成向导,你可以简单地做:

    try 
    { 
        File.Delete (Session["FileName"]); 
    } 
    catch(Exception ex) 
    { 
        //Handle it. 
    } 
    
+0

名称冲突永远不会成为问题,因为在成功完成向导后,文件将按插入记录的主键命名。谢谢,我会试一试并回复你。 – Chiramisu

+0

最后一个问题:我想我已经搞清楚了,除了如何从会话变量中获取实际的文件流。我有'Dim myFileStream As Stream = Session.Item(“File”)'File1.FileContent'。注意'File1.FileContent'返回流。我将什么添加到'Session.Item(“文件”)'得到流回? “文件”是Web服务器上文件的完全限定路径。谢谢;) – Chiramisu

+0

@Chiramisu我没有建议你把SessionStream中的FileStream。我将编辑我的答案。 – Icarus