我看到很多人想出了一些通过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
错误,假设所有错误检查都已到位。
谢谢!
答案 0 :(得分: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
}
}
答案 1 :(得分: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事件的调用也不会发生在nornal页面回发中。RequestAsPostBack="true"
因此,PagePreRender不会发生。
唯一的问题是,在上传完成后如何在客户端执行任何其他处理(例如,上传图片)。
我正在进行的工作是使用客户端事件
FileStateChanged
处理完最后一个文件时
if (file.state > Flajaxian.File_Uploading && isLast) {
我使用JQuery单击隐藏的提交按钮。回发查看保存文件时存储的会话值,并将图像渲染回DIV。
但是,由于某种原因,立即提交会导致FileReceived事件中的空会话出现问题(我假设因为内部异步回调尚未完成)。在启动回发之前暂停几秒钟就可以了。