Solved

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

Posted on 2004-04-23
7
226 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:numten
Comment Utility
I would greatly appreciate that!  :)  Thanks!
0
 

Author Comment

by:numten
Comment Utility
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
Comment Utility

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

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

IP addresses can be stored in a database in any of several ways.  These ways may vary based on the volume of the data.  I was dealing with quite a large amount of data for user authentication purpose, and needed a way to minimize the storage.   …
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…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

763 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

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now