[bold]UploadClass.asp [/bold]
<!pre> <!% ' Author: Adrian Forbes ' See UploadHelp.htm for usage instructions
Class Upload Private sExtensions Private lMax Private iMode Private objForm, objFiles Private adVarChar, adBoolean, adInteger, adLongVarChar, adDouble Private lDataLen Private sData Private sUploadPath
Public Property Get UploadPath() UploadPath = sUploadPath End Property
Public Property Let UploadPath(sPath) sUploadPath = sPath if ...[bold]UploadClass.asp [/bold] [code] <pre> <% ' Author: Adrian Forbes ' See UploadHelp.htm for usage instructions
Class Upload Private sExtensions Private lMax Private iMode Private objForm, objFiles Private adVarChar, adBoolean, adInteger, adLongVarChar, adDouble Private lDataLen Private sData Private sUploadPath
Public Property Get UploadPath() UploadPath = sUploadPath End Property
Public Property Let UploadPath(sPath) sUploadPath = sPath if strcomp(right(sUploadPath,1), "\") <> 0 then sUploadPath = sUploadPath & "\" end if End Property
Public Property Get FormCollection() Set FormCollection = objForm End Property
Public Property Get FilesCollection() Set FilesCollection = objFiles End Property
Public Property Get FormCount() FormCount = objForm.Count End Property
Public Property Get FileCount() FileCount = objFiles.Count End Property
Public Function Form(vIndex) Dim aData
if IsNumeric(vIndex) then aData = objForm.Items Form = aData(vIndex - 1) else if objForm.Exists (vIndex) then Form = objForm.Item(vIndex) end if end if End Function
Public Function FormName(vIndex) Dim aData
if IsNumeric(vIndex) then aData = objForm.Keys FormName = aData(vIndex - 1) else if objForm.Exists (vIndex) then FormName = vIndex end if end if End Function
Public Function File(vIndex) Dim aData
if IsNumeric(vIndex) then aData = objFiles.Items set File = aData(vIndex - 1) else if objFiles.Exists (vIndex) then set File = objFiles.Item(vIndex) end if end if End Function
Public Property Get ValidExtensions() ValidExtensions = sExtensions End Property
Public Property Let ValidExtensions(sExt) sExtensions = sExt End Property
Public Property Get MaxUploadSize() MaxUploadSize = lMax End Property
Public Property Let MaxUploadSize(lMaxUpload) lMax = lMaxUpload End Property
Public Property Get OverwriteMode() OverwriteMode = iMode End Property
Public Property Let OverwriteMode(iOWMode) iMode = iOWMode End Property
Public Property Get DataLength() DataLength = lDataLen End Property
Public Property Let DataLength(lBytes) lDataLen = lBytes End Property
Public Property Get RawData() RawData = sData End Property
Private Sub Class_Initialize()
set objForm = CreateObject("Scripting.Dictionary") set objFiles = CreateObject("Scripting.Dictionary")
' Define the ADO constants, you can INCLUDE adoinc.vbs or reference ' the type library instead if you want adVarChar = 200 adBoolean = 11 adInteger = 3 adLongVarChar = 201 adDouble = 5
owNoOverwrite = 0 ' the upload will not overwrite an existing file of the same name owOverwrite = 1 ' the upload will overwrite an existing file of the same name owUnique = 2 ' if a file exists with the same name the uploaded file will be given a new, unique name
sExtensions = "" lMax = 0 iMode = 0 UploadPath = Server.MapPath (".") end sub
Private Sub Class_Terminate() objForm.RemoveAll set objForm = nothing
objFiles.RemoveAll set objFiles = nothing
End Sub
Public Sub ProcessRequest Dim aData, iHeadPos, iPos, iDelimLen, iFileCount Dim objRS, sDelimeter, iHeadEnd, sHeader Dim lFormDataStart, lFormDataEnd, lSize Dim sFieldname, sPath, sFormData, bFile Dim objFSO, bExists, lCount, iFilenameStart Dim sFilename, lMIMEStart, lMIMEEnd, sMIME Dim objFile, bSave, sSaveAs, objUploadFile Dim tmpData, aFilename
' Find out how much data is in the request lDataLen = Request.TotalBytes
' Load the data into aData which will be a safe array aData = Request.BinaryRead(lDataLen)
' The problem with this data is that VBScript can't manipulate the binary ' data so we need to convert it into text. There are routines to do this, ' but we're going to get the Recordset object to do it for us if lenb(aData) > 0 then Set objRS = CreateObject("ADODB.Recordset") ' Append a field of type LongVarChar that is the length of our data objRS.Fields.Append "Data", adLongVarChar, lenb(aData) objRS.Open ' Add a new record objRS.AddNew ' Insert the data into the field objRS("Data").AppendChunk aData objRS.Update ' And then get it out as ASCII text! sData = objRS("Data") set objRS = nothing else sData = "" end if
' Clean up the array aData = ""
' We want to find out the delimeter that separates each FORM item ' The delimeter will be the first line so look for the first CRLF ' and the delimeter is everything before that CRLF iPos = Instr(sData, vbCRLF) if iPos > 0 then sDelimeter = left(sData, iPos - 1) end if
' If the FORM is empty then there will have been no CRLF so sDelimeter will ' be empty. Do a check just to make sure some data has been posted if len(sDelimeter) > 0 then ' We're going to keep track of our position through the data, starting at the start! iPos = 1 do ' Find the start of the delimeter iPos = Instr(iPos, sData, sDelimeter, 1) ' Move past the delimeter and the CRLF to come to the header iPos = iPos + len(sDelimeter & vbCRLF) ' The header data ends with CRLFCRLF so find the position of the ' next CRLFCRLF. Adding 3 to this value means we get past the ' header and the trailing CRLFCRLF iHeadEnd = Instr(iPos, sData, vbCrLf & vbCrLf, 1) + 3
' We know that iPos is the start of the header and iHeadEnd is the end ' so get the text inbetween sHeader = Mid(sData, iPos, iHeadEnd - iPos + 1) ' The data starts at the position 1 after the header lFormDataStart = iHeadEnd + 1 ' The data ends with a CRLF and then the next delimeter so find out where ' the delimeter is and subtract 3 which takes us before the CRLF and ' to the end of the data lFormDataEnd = Instr(lFormDataStart, sData, sDelimeter, 1) - 3
' Calculate the size of the data lSize = lFormDataEnd - lFormDataStart + 1 ' The name of the field is in the header's "name" field. We have written ' a small function called GetFieldData that reads the values of fields in ' the header sFieldname = GetFieldData(sHeader, "name", bExists)
' To find out if this FORM data is an uploaded file we want to search ' the header for the presence of a filename header. sPath = GetFieldData(sHeader, "filename", bExists)
' If a filename has been found then we know it's a file if bExists then bFile = true iFilenameStart = 0 sFilename = "" aFilename = Split(sPath,"\") if UBound(aFilename) >= 0 then sFilename = aFilename(UBound(aFilename)) else sFilename = "" end if ' As it's a file we want to find the MIME type. This is held in the Content-Type field ' Find the start of the Content-Type field lMIMEStart = Instr(1, sHeader, "Content-Type:", 1) if lMIMEStart > 0 then ' Add 13 to this to get past Content-Type: and to the start of the data lMIMEStart = lMIMEStart + 13 ' Find the trailing vbCRLF lMIMEEnd = Instr(lMIMEStart, sHeader, vbCRLF, 0) if lMIMEEnd > 0 then ' Get the text in the middle sMIME = trim(mid(sHeader, lMIMEStart, lMIMEEnd - lMIMEStart)) end if end if else ' If bExists returned false then it is not a file but a FROM element. ' We know where the data starts and ends so let's get it. We only do ' this if it isn't a file to aid performance as we will return to ' save the files later on sFormData = mid(sData, lFormDataStart, lFormDataEnd - lFormDataStart + 1) bFile = false end if
' There is a collection of files and a collection of FORM elements, now that we ' know what we are dealing with we can add to the appropriate collection (dictionary object) if bFile then ' If it is a file we want to create a new FileDetails class and store ' the relevant data inside it
set objFile = New FileDetails objFile.Name = sFieldName objFile.Filename = sFilename objFile.OriginalPath = sPath objFile.Size = lSize / 1000 objFile.DataStart = lFormDataStart objFile.MIME = sMIME
' Add the class to the dictionary object objFiles.Add sFieldName, objFile else ' Ok, here is an HTTP "gotcha". There is nothing to stop you having ' multiple items called the same thing. We want to search the already ' saved FORM items to see if this is a duplicate name. if objForm.Exists(sFieldName) then ' There is already an item in the objForm collection so we want to ' append to the existing entry rather than create a new one tmpData = objForm.Item(sFieldName) ' We now add the new field to the end of the existing one and ' separate the two with a comma. ' So "ExistingData" will become "ExistingData,NewData" objForm.Item(sFieldName) = tmpData & "," & sFormData else ' This is a new FORM element so add a new entry to the collection objForm.Add sFieldName, sFormData end if end if ' Now that FORM element has been processed let's move on to the next ' one. The next section is the end of the data for this one + 3. The ' extra 3 is to take us past the CRLF that trails the data iPos = lFormDataEnd + 3
' Now we want to know if there is another FORM element after this one. The ' final element is followed by the delimeter and then "--". At this ' point iPos is pointing at the next delimeter, if that delimeter is ' followed directly by "--" then we don't want to continue processing loop until (iPos = instr(iPos, sData, sDelimeter & "--", 1))
' OK, all the FORM elements (file and non-file) have been stored in the ' appropriate collection. We want to revisit all of the file elements and save ' their data to disk. The reason we do it in this two-phase manner is so that ' we can contol the file saving process by elements in the FORM ' data. I also feel it just makes for a neater and more flexible solution. Set objFSO = CreateObject("Scripting.FileSystemObject") for iFileCount = 1 to objFiles.Count ' Get a handle on the instance of the FileDetails object in the collection set objFile = File(iFileCount)
bSave = true
' Check the size of the file to ensure it is below any limit ' we have set if lMax > 0 then if cdbl(objFile.Size) > lMax then bSave = false ' The file was bigger than the set limit so lets make that clear by ' saying so in the SavedAs field. I just think it's a nice touch. objFile.ErrorDescription = "File exceeded size limit of " & lMax end if end if
' Get the physical path to save the file to sPath = sUploadPath ' Get the original filename sFilename = objFile.Filename if len(trim(sFilename)) = 0 then ' There is no filename so the user did not select a file to upload bSave = false objFile.ErrorDescription = "A file was not selected for uploading" else ' GetFilename will return the name we have to save the file to. If it returns empty ' the file cannot be saved. This will only happen if the file already exists and iMode ' is owNoOverwrite sFilename = GetFilename(sPath, sFilename, iMode) if len(sFilename) = 0 then bSave = false objFile.ErrorDescription = "A file of this name already exists and cannot be overwritten" end if end if
if bSave then ' We only want to save if the file's extension is in the list of valid extensions if not IsValidExtension (sFilename, sExtensions) then bSave = false objFile.ErrorDescription = "The file's extension is invalid. Only these files can be uploaded: " & sExtensions end if end if if bSave then
' Find out the path of the file to save by appending the filename to the upload path sSaveAs = sPath & sFilename
' The file size and extensions are all OK so we're ready to save. ' We saved the start position and length of the file data so let's use ' that to get the file. Remember that the size was previously ' divided by 1000 to show the size in kbs so we have to multiply it ' by 1000 to get the real size again sFormData = mid(sData, Cdbl(objFile.DataStart), Cdbl(objFile.Size) * 1000)
' Create the file and save the data to it set objUploadFile = objFSO.CreateTextFile (sSaveAs, true) objUploadFile.write sFormData objUploadFile.close set objUploadFile = nothing
' Now lets update the file object to show where the file was saved to objFile.SavedAs = sSaveAs end if next set objFSO = nothing end if
End Sub
Private Function GetFieldData(sText, sTarget, ByRef bHeaderExists) ' Extract the value from a named field in the header. The format is ' fieldname="fielddata" ' sText is the header, sTarget is the fieldname and the function returns fielddata Dim iPosS, iPosE
bHeaderExists = False
iPosS = instr(1, sText, sTarget & "=""") if iPosS < 1 then GetFieldData = "" exit function end if iPosS = iPosS + len(sTarget & "=""") iPosE = Instr(iPosS, sText, """") if iPosE < iPosS then GetFieldData = "" exit function end if
GetFieldData = mid(sText, iPosS, iPosE - iPosS)
bHeaderExists = True
End Function
function GetFilename(ByVal sPath, ByVal sFilename, ByVal iMode) ' This function will return the name of the file to be created ' If the file cannot be created then it returns an empty string dim objFSO, lIndex, bFound, sTempFilename, sFile, iPos, sExt
select case iMode case owOverwrite ' We are using overwrite mode so it doesn't matter if the file ' already exists GetFilename = sFilename case owNoOverwrite ' We are not in overwritw mode so check to see if the ' file exists set objFSO = CreateObject("Scripting.FileSystemObject") if objFSO.FileExists (sPath & sFilename) then ' It does so return an empty string GetFilename = "" else ' It doesn't so return the filename as it's OK to save. GetFilename = sFilename end if set objFSO = nothing case owUnique ' Unique mode means that the file will be saved but amended ' if neccessary so that it doesn't overwrite existing files set objFSO = CreateObject("Scripting.FileSystemObject") ' First check to see if the file exists, if it doesn't things ' are nice and simple if objFSO.FileExists (sPath & sFilename) then ' The file already exists so we need to find a new name for it ' First of all split it up into its name and extension sFile = sFilename sExt = "" for iPos = len(sFilename) to 1 step -1 If Strcomp(Mid(sFilename, iPos, 1), ".") = 0 Then sFile = left(sFilename, iPos - 1) sExt = mid(sFilename, iPos+1) exit for end if next ' We will get a unique name by adding a number in parenthesis until ' we get a unique name. So for file.txt we will try file(2).txt ' then file(3).txt and so on bFound = false lIndex = 2 while not bFound sFilename = sFile & "(" & lIndex & ")." & sExt if objFSO.FileExists(sPath & sFilename) then lIndex = lIndex + 1 else bFound = true end if wend set objFSO = nothing ' Return the new, unique filename GetFilename = sFilename else ' The file doesn't exists so it can keep its name GetFilename = sFilename end if set objFSO = nothing end select end function
function IsValidExtension(byval sFilename, byval sValidExtensions) ' Given a filename and comma separated list of valid extensions this ' function checks that the filename has an extension that appears ' in the valid list dim iPos, sExt, aExt, iIndex
if len(trim(sValidExtensions)) = 0 then IsValidExtension = true exit function end if
sFilename = Trim(sFilename) for iPos = len(sFilename) to 1 step -1 If Strcomp(Mid(sFilename, iPos, 1), ".") = 0 Then sExt = mid(sFilename, iPos+1) aExt = split(sValidExtensions, ",") for iIndex = lbound(aExt) to ubound(aExt) if strcomp(trim(aExt(iIndex)), sExt, 1) = 0 then IsValidExtension = true exit function end if next end if next
IsValidExtension = false end function
end class
Class FileDetails ' This class is simply a glorified UDT to store data about each file. An instance ' of this class for each submitted file will be stored in a dictionary object Private sFormName Private sFileName Private lFileSize Private sOriginalPath Private lDataStart Private sMIME Private sError Private bSaved Private sSavedAs
Public Property Get SavedAs() SavedAs = sSavedAs End Property
Public Property Let SavedAs(sFile) sSavedAs = sFile bSaved = True End Property
Public Property Get Saved() Saved = bSaved End Property
Public Property Let Saved(bVal) bSaved = bVal End Property
Public Property Get ErrorDescription() ErrorDescription = sError End Property
Public Property Let ErrorDescription(sDesc) sError = sDesc End Property
Public Property Get MIME() MIME = sMIME End Property
Public Property Let MIME(sType) sMIME = sType End Property
Public Property Get DataStart() DataStart = lDataStart End Property
Public Property Let DataStart(lStart) lDataStart = lStart End Property
Public Property Get OriginalPath() OriginalPath = sOriginalPath End Property
Public Property Let OriginalPath(sPath) sOriginalPath = sPath End Property
Public Property Get Size() Size = lFileSize End Property
Public Property Let Size(lSize) lFileSize = lSize End Property
Public Property Get Filename() Filename = sFileName End Property
Public Property Let Filename(sFile) sFileName = sFile End Property
Public Property Get Name() Name = sFormName End Property
Public Property Let Name(sName) sFormName = sName End Property
Private Sub Class_Initialize() bSaved = False End Sub
End Class
%> </pre>
[bold]Uploadhelp.asp [/bold][bold]Properties[/bold][bold]UploadPath[/bold]The physical path the uploaded files will be saved toobjUpload.UploadPath = "c:\uploads\"objUpload.UploadPath = Server.MapPath "/images/" [bold]FormCollection[/bold]The dictionary object containing the FORM dataSet objForm = objUpload.FormCollection [bold]FilesCollection[/bold]The dictionary object containing a collection of FileDetails classesSet objFiles = objUpload.FilesCollection [bold]FormCount[/bold]Number of non-file items posted with the Form Response.Write objUpload.FormCount [bold]FileCount[/bold]Number of file items posted with the Form Response.Write objUpload.FileCount [bold]ValidExtensions[/bold]A comma separated list of valid extensions objUpload.ValidExtensions = "jpg,gif,bmp,tif,tiff" [bold]MaxUploadSize[/bold]The maximum size, in bytes, that files are allowed to be objUpload.MaxUploadSize = 2048 [bold]OverwriteMode[/bold]This defines how to treat the saving of files that already exist. Type Value Description NoOverwrite 0 (default) The file is not saved if one of the same name already exists Overwrite 1 If a file of the same name already exists then it is overwritten with the uploaded Unique 2 If a file of the same name already exists then the uploaded file is renamed to be unique. For example test.txt will become test(1).txt objUpload.OverwriteMode = 1 [bold]DataLength[/bold]The size of the raw POST data. Only available after a call to ProcessRequest Response.Write objUpload.DataLength [bold]RawData[/bold]The raw POST data. Only available after a call to ProcessRequest Response.Write " " & objUpload.RawData & "
[bold]Functions[/bold][bold]ProcessRequest[/bold]Save uploaded files to disk and construct the Form and Files collections objUpload.ProcessRequest [bold]Form(vIndex)[/bold]Returns the content of a Form item. vIndex can be a numerical index (1 based) or the textual name Response.Write "Hello " & objUpload.Form("txtName")Response.Write "Hello " & objUpload.Form(1) [bold]FormName(vIndex)[/bold]Returns the name of the Form item. vIndex can be a numerical index (1 based) or the textual name Response.Write "The value of " & objUpload.FormName(1) & " is " & objUpload.Form(1) [bold]File(vIndex)[/bold]Returns the instance of the FileDetails class for a given file. vIndex can be a numerical index (1 based) or the textual name Set objFile = objUpload.File(1) The properties of the File object areProperty Type Description Name String The name of the FORM field the file was submitted from Filename String The name of the file Size Double The size of the file in Kb OriginalPath String The full path and name of the file on the client's file system DataStart Long The location of the start of the data in the POST. This value is used internally. MIME String The MIME type of the file Saved Boolean True if the file was successfully saved, False if not SavedAs String If the file was saved, this is the full path and filename of the file ErrorDescription String If the file was not saved this contains the reason why [bold]Usage examples[/bold]Getting details on all of the files uploaded
<table border="1"> <tr> <td>Name</td><td>Filename</td><td>Size (kb)</td><td>Saved?</td> <td>MIME Type</td><td>Original Path</td><td>Saved As</td> </tr> <% for i = 1 to objUpload.FileCount set objFile = objUpload.File(i)
Response.Write "<tr><td>" & objFile.Name & "</td>" & vbCRLF Response.Write "<td>" & objFile.Filename & "</td>" & vbCRLF Response.Write "<td>" & objFile.Size & "</td>" & vbCRLF Response.Write "<td>" & objFile.Saved if objFile.Saved then Response.Write "</td>" & vbCRLF else Response.Write " " & objFile.ErrorDescription & "</td>" & vbCRLF end if Response.Write "<td>" & objFile.MIME & "</td>" & vbCRLF Response.Write "<td>" & objFile.OriginalPath & "</td>" & vbCRLF Response.Write "<td>" & objFile.SavedAs & "</td>" & vbCRLF Response.Write "</tr>" & vbCRLF next %> </table>
Getting details on all of the form elements submitted
<table border="1"> <tr><td>Name</td><td>Value</td></tr> <% for i = 1 to objUpload.FormCount Response.Write "<tr><td>" & objUpload.FormName(i) & "</td>" & vbCRLF Response.Write "<td>" & objUpload.Form(i) & "</td>" & vbCRLF Response.Write "</tr>" & vbCRLF next %> </table>
[bold]UploadReceive.asp [/bold]
<%@ Language=VBScript %> <%option explicit%> <%server.ScriptTimeout = 600%> <html> <head> <title>Pure ASP upload</title> <META NAME="Author" Content="Adrian Forbes"> </head> <!-- #Include File="uploadclass.asp" --> <body> <pre> <% ' See UploadHelp.htm for usage instructions
Dim owNoOverwrite, owOverwrite, owUnique Dim objUpload Set objUpload = New Upload ' If we want to limit the size of uploads set the lMax value to the ' max amount of kb we want to load. 2048 is 2mb. For no limit set ' this to 0
'objUpload.MaxUploadSize = 2048 ' If we want to limit the type of files to upload add the extensions of valid ' files to sExtensions as a comma separated list. If you don't want to ' limit the extensions simply make the variable blank ("") 'objUpload.ValidExtensions = "zip,txt,jpg,gif" ' Define the overwrite constants
owNoOverwrite = 0 ' the upload will not overwrite an existing file of the same name owOverwrite = 1 ' the upload will overwrite an existing file of the same name owUnique = 2 ' if a file exists with the same name the uploaded file will be given a new, unique name
' Set the overwrite mode objUpload.OverwriteMode = owOverwrite
' Set the path we want the files to be saved to. If this is not ' supplied it defaults to the directory that the page is in objUpload.UploadPath = server.MapPath (".") ' Do the work objUpload.ProcessRequest ' We're going to see if the "raw data" checkbox has been checked, if so ' display the raw post. This will help you understand what is going on. if len(trim(objUpload.Form("chkRaw"))) > 0 then Response.Write "<p>Data (" & objUpload.DataLength & " bytes): <pre>" & objUpload.RawData Response.Write vbCRLF & "</pre> <hr>" end if %>
<h2>File results</h2>
<table border="1" cellpadding=5> <tr><td>Name</td><td>Filename</td><td>Size (kb)</td><td>Saved?</td><td>MIME Type</td><td>Original Path</td><td>Saved As</td></tr> <% ' OK, at this stage we have an instance of the Upload class (objUpload) which exposes two collections, ' one for files and one for FORM data Dim i, objFile
for i = 1 to objUpload.FileCount set objFile = objUpload.File(i)
Response.Write "<tr><td>" & objFile.Name & "</td>" & vbCRLF Response.Write "<td>" & objFile.Filename & "</td>" & vbCRLF Response.Write "<td>" & objFile.Size & "</td>" & vbCRLF Response.Write "<td>" & objFile.Saved if objFile.Saved then Response.Write "</td>" & vbCRLF else Response.Write " " & objFile.ErrorDescription & "</td>" & vbCRLF end if Response.Write "<td>" & objFile.MIME & "</td>" & vbCRLF Response.Write "<td>" & objFile.OriginalPath & "</td>" & vbCRLF Response.Write "<td>" & objFile.SavedAs & "</td>" & vbCRLF Response.Write "</tr>" & vbCRLF next %> </table>
<h2>Form results</h2> <table border="1" cellpadding=5> <tr><td>Name</td><td>Value</td></tr> <% for i = 1 to objUpload.FormCount Response.Write "<tr><td>" & objUpload.FormName(i) & "</td>" & vbCRLF Response.Write "<td>" & objUpload.Form(i) & "</td>" & vbCRLF Response.Write "</tr>" & vbCRLF next %> </table> <% set objUpload = nothing %> </pre> </body> </html>
[bold]UploadSend.asp [/bold]
<p> This is a test FORM. We will POST two text boxes, two files, two checkboxes and a textarea. The checkboxes have the same name. <FORM ACTION="UploadReceive.asp" METHOD="POST" ENCTYPE="multipart/form-data"> <input type=checkbox name=chkRaw value="Yes">Show raw data
<input type=text name=txtData1>
<INPUT TYPE=FILE NAME="UploadFormName1">
<input type=text name=txtData2>
<INPUT TYPE=FILE NAME="UploadFormName2">
<textarea name=txtTextArea rows="5" cols="70"></textarea>
<input type=checkbox name=chkTest value="Yes">Test checkbox
<input type=checkbox name=chkTest value="No">Test checkbox
<INPUT TYPE="SUBMIT">
</FORM>
| DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware. |
More ASP Articles More By Adrian Forbes developerWorks - FREE Tools! | Building a software-as-a-service solution requires addressing a few key technical challenges. In this webcast, we'll focus on the role of IBM Tivoli Directory Server and WebSphere Portlet Factory in creating a Software as a Service solution. We will demonstrate how to use Tivoli Directory Server to prevent the user population of one tenant from accessing the virtual portal and portlet components of another tenant. We will also use the dynamic profile capability of WebSphere Portlet Factory to create multiple highly customized applications from one code base. FREE! Go There Now!
| | | | Build secure Web services with transport-level security using IBM Rational Application Developer V7 and IBM WebSphere Application Server V6.1. Follow this three-part series for step-by-step instructions about how to develop Web services and clients, configure HTTP basic authentication, and configure HTTP over SSL (HTTPS). This first part of the series walks you through building a Web service for a simple calculator application. You generate and test two different types of Web services clients: a Java Platform, Enterprise Edition (Java EE) client and a stand-alone Java client. You also handle user-defined exceptions in Web services. FREE! Go There Now!
| | | | WebSphere Process Server delivers a unique integration framework that simplifies existing IT resources. Often, as IT assets grow to support business demand, so too does their complexity and manageability. In this webcast, we’ll discuss how WebSphere Process Server helps deliver an SOA infrastructure that provides a common model to orchestrate, mediate, connect, map, and execute the underlying IT functions. Discover how WebSphere Process Server simplifies integration of business processes by leveraging existing IT assets as reusable services without the complexities of traditional integration methodologies. FREE! Go There Now!
| | | | IBM Enterprise Modernization solutions help organizations evolve core IT systems towards modern architectures and technologies—reducing the burden of maintenance and freeing up resources to develop new business requirements and capabilities. With the IBM Enterprise Modernization Sandbox for System z you can evaluate IBM Enterprise Modernization solutions focused on five key areas: Assets, Architectures, Skills, Processes and Infrastructures, and Investment. Each solution is based upon real customer experiences and offers a proven path to get you started with your modernization projects. FREE! Go There Now!
| | | | Try the latest version of IBM Rational Manual Tester V7.0.1 by downloading a free trial from IBM developerWorks. This manual test authoring and execution tool promotes test step reuse to reduce the impact of software change on testers and business analysts and addresses the needs of teams performing at least a portion of their testing manually. FREE! Go There Now!
| | | | Get a free trial download of the latest version of IBM Rational Performance Tester V7.0.1, a load and performance testing solution for teams concerned about the scalability of their Web-based applications. Combining multiple ease-of-use features with granular detail, Rational Performance Tester simplifies the test-creation, load-generation and data-collection processes that help teams ensure the ability of their applications to accommodate required user loads. FREE! Go There Now!
| | | | Whether you are creating new applications or modifying existing ones, managing integration of new components with traditional z/OS elements is a critical part of building and deploying modern applications. Listen to this webcast to see how IBM can help you optimize your development process using an IDE like Rational Developer for System z that integrates with management tools, such as ClearCase to manage your application development on mainframes. FREE! Go There Now!
| | | | The discipline of assembling and delivering software is maturing beyond standard developer-centric compile/test software builds. The end-to-end software development lifecycle is emerging as the new focus moves “Beyond the Build.” Join this on demand webcast to learn about methods for streamlining software delivery and key capabilities of the IBM Rational Build Forge framework for automating build and release management in environments of any size. FREE! Go There Now!
| | | | WebSphere Process Server delivers a unique integration framework that simplifies existing IT resources. Often, as IT assets grow to support business demand, so too does their complexity and manageability. In this webcast, we’ll discuss how WebSphere Process Server helps deliver an SOA infrastructure that provides a common model to orchestrate, mediate, connect, map, and execute the underlying IT functions. Discover how WebSphere Process Server simplifies integration of business processes by leveraging existing IT assets as reusable services without the complexities of traditional integration methodologies. FREE! Go There Now!
| | | | The unprecedented scope of a service-oriented architecture (SOA) initiative brings to the forefront a number of management and governance issues that were sidestepped in the past. The key to a successful SOA implementation is managing and governing activities throughout the entire SOA delivery lifecycle by ensuring that services conform to the needs of all of the business’s stakeholders. Learn how service lifecycle management allows the business to ensure that the process by which services are defined, created, tested, deployed, optimized and retired is manageable, repeatable and auditable. FREE! Go There Now!
| | | | All FREE IBM® developerWorks Tools! | |