Problem:
For each document I can have an upload icon. Every of those documents are saved in a specific folder (don't ask me why!!!). The customer asked me that the upload page load automatically the folder where the file will be uploadedIn this way if the document is in the folder /FolderA/SubFolderB, I will press the icon and I will have /FolderA/SubFolderB in my Destaination Folder textbox.
I have looking around on the net if anyone got a similar problem, but I didn’t find a response.
Solution:
Armed with a good time and two of my friends: notepad2 and JetBrains dotPeek, I did a bit of analysis.First of all I opened the page
%SHAREPOINTFOLDER%\TEMPLATE\LAYOUTS\upload.aspx
by the notepad2 to understand which is the dll of its code behind:
<%@ Page Language="C#" DynamicMasterPageFile="~masterurl/default.master" Inherits="Microsoft.SharePoint.ApplicationPages.UploadPage"%>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
you can find this dll in the folder _app_bin of your site (example: C:\inetpub\wwwroot\wss\VirtualDirectories\26295\_app_bin). I opened the file Microsoft.SharePoint.ApplicationPages.dll with JetBrains dotPeek and I found what I was looking for:
protected virtual string CurrentFolderServerRelativeUrl { get { if (this.m_folderUrl == null) { string str = this.Request.QueryString["RootFolder"]; this.m_folderUrl = string.IsNullOrEmpty(str) ? this.CurrentList.RootFolderUrl : str; } return this.m_folderUrl; } }this property is used later for the following reason:
stringBuilder.Append("&RootFolder="); stringBuilder.Append(SPHttpUtility.UrlKeyValueEncode(this.CurrentFolderServerRelativeUrl)); ... this.Destination.Text = SPHttpUtility.HtmlEncode(this.CurrentFolderServerRelativeUrl); ... private SPFile UploadFile(out string leafName, out SPVirusCheckStatus checkStatus, out string virusMessage) { HttpPostedFile postedFile = this.InputFile.PostedFile; leafName = UploadPage.GetLeafName(postedFile.FileName); SPFile file = this.Web.GetFile(this.CurrentFolderServerRelativeUrl + "/" + leafName); bool flag1 = false;
Okie dokie, so I need a javascript method like this:
function uploadDialog(folder) { var id = String(this.list.get_id()); this.url = '/_layouts/Upload.aspx?List={' + id.toUpperCase() + '}&RootFolder=' + folder; optionProcedure = { width: 800, height: 500, url: this.url, title: 'Upload doc' }; SP.UI.ModalDialog.showModalDialog(optionProcedure); }
where the id is the ListId loaded before and the RootFolder is where I want upload the new file. I will call this method in this way:
<a href="#" onclick="javascript:uploadDialog('/Lists/MyDocs/FolderA/SubFolderB'); return false;"> <img src="/_layouts/images/xxx.Intranet.WebParts/procedura_upload.png" title="Open form" alt="Open form" style="border: 0px;"></a>
in this way I will have the Folder of my Destination folder populated with /FolderA/SubFolderB
No comments:
Post a Comment