0

我看到很多人想出了一些过度的方法来使用flajaxian多文件上传控制即时更改文件夹位置。

只是想知道更有经验的人是否可以看看我想出的方式,让我知道是否有任何我应该关注的重大问题。(假设我有适当的错误检查。)

我计划初始化控件,如下所示。:

<cc1:FileUploader ID="FileUploader1" runat="server" OnFileReceived="fileUploader_FileReceived" RequestAsPostBack="true">

    </cc1:FileUploader>

(我RequestAsPostBack="true"还有一些其他控件需要检查我的事件处理程序)

我只是更改HttpFileCollection.SaveAs. fileUploader_FileReceived event由于flajaxian 一次只上传一个文件,我们可以预期集合中只有一个文件(否则我们可以使用循环)。

protected void fileUploader_FileReceived(object sender, 
com.flajaxian.FileReceivedEventArgs e)
 {

        HttpFileCollection files = Request.Files;
        // Change path to whichever folder I need
        String TempFileName = "C:\\NEW\\PATH\\TO\\Folder\\" + files[0].FileName;
        // Save the file.
        files[0].SaveAs(TempFileName);
}

只要文件夹存在,此实现似乎就可以很好地工作!我只是想知道这样technically的实现是否有任何问题,再次假设所有错误检查都已到位。

谢谢!

4

2 回答 2

0

更好的方法是使用适配器,并在 OnFileNameDetermining事件中重写文件夹位置。这样,我们还可以通过适配器获得所有好处。

<cc1:FileUploader ID="FileUploader1" runat="server"` OnFileReceived="fileUploader_FileReceived" RequestAsPostBack="true">
            <Adapters>
                <cc1:FileSaverAdapter runat="server" FolderName="Ups" OnFileNameDetermining="fileUploader_FileDetermined" />
            </Adapters>
</cc1:FileUploader>

在文件确定事件中,我们可以以编程方式更改文件夹位置

protected void fileUploader_FileDetermined(object sender, com.flajaxian.FileNameDeterminingEventArgs e)
{
    e.FileName = "C:\\NewFolder\\" + e.File.FileName;
}

我们可以使用 FileReceived 事件来检查文件夹是否存在,如果不存在,则创建它。

protected void fileUploader_FileReceived(object sender, com.flajaxian.FileReceivedEventArgs e)
{
     int fileIndex = e.Index;
     if (fileIndex == 0)
     {
        // We are on our first file, check if the new folder exists, if not, create it
     }
}
于 2012-05-02T16:22:53.643 回答
0

您所做的很好,但是,如果您要在网站内保存文件,请考虑使用 MapPath 方法从网站内的虚拟路径创建物理文件夹

MapPath("/Images/User1")

这是我的最小 APSX 实现

<fjx:FileUploader ID="FileUploader1" runat="server" OnFileReceived="FileUploader2_FileReceived">
</fjx:FileUploader>

未指定适配器或文件夹。当 FileRecevied 事件触发时,我将文件保存到基于表单身份验证用户名的文件夹(名称不使用文件夹名称中不允许的字符)。

另请注意,FileReceivedEventArgs 引用了 (HTTP) 文件

e.File

FileUploader 控件将显示所有已处理的文件 - 如果出现错误,您甚至可以设置状态码(例如 550),然后将其返回给客户端。

请注意,对 FileReceived 事件的服务器调用不会发生在正常页面回发中,即使您指定

RequestAsPostBack="true"

因此,不会发生 PagePreRender。

唯一的问题是,上传完成后如何在客户端执行任何其他处理(例如显示上传的图像)。

为此我正在进行的工作是使用客户端事件

FileStateChanged

处理最后一个文件时

if (file.state > Flajaxian.File_Uploading && isLast) {

我使用 JQuery 单击隐藏的提交按钮。回发查看保存文件时存储的会话值,并将图像渲染回 DIV。

但是,由于某种原因,立即提交会导致 FileReceived 事件中的空会话出现问题(我假设是因为内部异步回调尚未完成)。在启动回发之前暂停几秒钟可以正常工作。

于 2012-06-28T20:15:34.230 回答