Solved

Open File in Correct Application - .NET / Blob / Oracle / Datagrid

Posted on 2004-04-23
7
230 Views
Last Modified: 2007-12-19
I was wondering if someone an help me get this solution.

I insert a blob into our oracle 9i database.  That's fine, no problems with the insert.  Now I want to return the information (file name and blob) and place it into a datagrid.  All I want though is for the user to see a list of file names and they can click on a file name and it will open the file up in the correct application (word, excel etc...)

Here is some of what I have.  This code is what I'm using to manipulate the datagrid, but it's really wrong.  I'm returning  two field names from my stored procedure: cmnt_txt (name of the blob file) and the actual blob file.

**************************************************************
 Private Sub dgappln_attm_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgappln_attm.ItemDataBound
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            Dim HLAttachment As HyperLink = e.Item.Cells(0).FindControl("HLAttachment")
            HLAttachment.NavigateUrl = e.Item.DataItem("cmnt_txt")  'not right.  I want it to open not navigate to a url
            HLAttachment.Text = e.Item.DataItem("cmnt_txt").ToString  'this is the list of file names
           
                  End If
    End Sub

********************************************

I'll award extra points for quick response and easy to implement.  Please be gentle, I'm a beginner and get lost easy.  :)
Thanks! ;)
0
Comment
Question by:numten
  • 3
  • 2
7 Comments
 
LVL 37

Accepted Solution

by:
gregoryyoung earned 500 total points
ID: 10908026
Step 1: Write out blob to temp file with same extension as filename you have in database (or write it to same filename etc)

Step 2: use Process.Start(Filename) (available in System.Diagnostics)

You can give it the name of a document (write out your blob to a temp file with the proper extension) and it will try to find the associated application on that machine to run.

.NET Framework Class Library  

Process.Start Method (String)
Starts a process resource by specifying the name of a document or application file and associates the resource with a new Process component.

[Visual Basic]
Overloads Public Shared Function Start( _
   ByVal fileName As String _
) As Process
[C#]
public static Process Start(
   string fileName
);
[C++]
public: static Process* Start(
   String* fileName
);
[JScript]
public static function Start(
   fileName : String
) : Process;
Parameters
fileName
The name of a document or application file to run in the process.
0
 
LVL 7

Expert Comment

by:culshaja
ID: 10916339
You need to use a hyperlink rather than a a linkbutton for the link to open the file in the datagrid. You then need to implement a HTTPModule. The following is an example:

Public Class DocumentRequestHandler
    Implements IHttpHandler


    'Notice ProcessRequest is the only method
    'exposed by the IHttpHandler
    Public Sub ProcessRequest(ByVal context As HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
        Dim strFilename As String

            Dim appsrv As New WebService.ASMXFile
            'grab filename from end of URL
            Dim strArray As String() = Split(context.Request.RawUrl, "/")

            strFilename = strArray(UBound(strArray))
            strArray.Initialize()
            strArray = Split(strFilename, ".")
            strFilename = strArray(0)
            strArray = Nothing

           context.Response.ContentType = "application/pdf"
           context.Response.BinaryWrite(appsrv.GetDocumentBinary(strFilename))
           
    End Sub

    'By calling IsReusable, an HTTP factory can query a handler to
    'determine whether the same instance can be used to service
    'multiple requests

    Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property

End Class

The ContentType will need to be set with the correct MIMEType based on the file extension of the file. You can simply do that with a case statement.

You need to andd the following to the <HTTPHandlers> section of Web.config:

<add verb="*" path="*xdocuments/*" type="YourProjectName.DocumentRequestHandler, YourProjectName"/>

The url of the document needs to have xdocuments/filenamefromdb for this to work as the HTTPHandler is only invoked to pull the document from the database when it sees xdocuments in the URL.

James :-)


0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10918213
oh whoops didnt see that it was asp.net. actually all you need to do is set the content type and the write the binary to response.

ill post an example when I get to the office in about 45 minutes.
0
MIM Survival Guide for Service Desk Managers

Major incidents can send mastered service desk processes into disorder. Systems and tools produce the data needed to resolve these incidents, but your challenge is getting that information to the right people fast. Check out the Survival Guide and begin bringing order to chaos.

 

Author Comment

by:numten
ID: 10918250
I would greatly appreciate that!  :)  Thanks!
0
 

Author Comment

by:numten
ID: 10952191
I haven't had a chance to try out your suggestion, but I will tomorrow.  I did not forget about you and your hard work!
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10954524

put something along the lines of this in the page load of "File.aspx"

 //get the image id from the url
string ImageId = Request.QueryString["FileId"];

//build our query statement
string sqlText = "SELECT data, contenttype FROM files WHERE pkFileId = " + FileId;

SqlConnection connection = new SqlConnection(ConenctionString);
SqlCommand command = new SqlCommand( sqlText, connection);

//open the database and get a datareader
connection.Open();
SqlDataReader dr = command.ExecuteReader();
if ( dr.Read()) //yup we found our image
{
Response.ContentType = dr["contenttype"].ToString();
Response.BinaryWrite( (byte[]) dr["data"] );
}
connection.Close();

then you can put your links to "file.aspx?FileId=5" (or whatever)

You can do this most of the time with your response (just change the content type). If the remote pc knows the content type it can open.
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Flash (http://en.wikipedia.org/wiki/Adobe_Flash) has evolved over the years to where it has become a masterful tool for displaying content screen.  It has excellent layout placement, UI precision as well as rendering capabilities. This, along with t…
Summary Displaying images in RichTextBox is a common requirement with limited solutions available. Pasting through clipboard or embedding into RTF content only support static images.  This article describes how to insert Windows control objects int…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

792 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question