2014-02-24 12 views
0

我目前正在一個項目中,我只能在本地訪問一個文件服務器上的一堆tiff圖像,所有圖像都是tiff,這給我一個很難的時間'因爲圖像要顯示在Web瀏覽器,問題是,我已經發現有麻煩解決這一問題的好我自己,這是我一直在做:如何將其轉換爲將圖像流回到iframe的WCF服務?

問題:

希望在網站上安裝此更新的人曾使用一個aspx頁面,接收請求參數以搜索tiff圖像,將其轉換爲png並通過使用Response.OutputStream.Write將文件「流」到客戶端,現在,轉換文件和「流式傳輸」文件的過程是羚牛g在500毫秒到一整分鐘之間(這是最多100kb的文件)。

過去,他們使用了一種叫做「替換」的東西,它似乎更快,因爲它不需要手動轉換文件。問題是,這種方法需要使用iframe或對象。

我做了什麼

因爲我想要的一切更容易維護,我決定做一些修改頁面的工作方式和使用Web服務(ASMX)+ jQuery的阿賈克斯,現在,當我研究瞭如何使用它似乎使這項工作的唯一方法alternatiff是將文件轉換爲base64字符串,並將其嵌入在IFRAME SRC,作爲顯示如下:

var url = "/Web_Service/WS_Expedientes.asmx/getImagen"; 
     var type = "POST"; 
     var params = { 'ruta': $(this).attr('id') };//the id of the image that is being requested 

     ajaxCalls(type, url, params).done(function (result) { 
      //alert(JSON.stringify(result)); 
      var str = ""; 
      for (var i = 0; i < result.d.length; i++) 
       str += String.fromCharCode(result.d[i]); 
      var img= btoa(str) 

      //alert(JSON.stringify(img)); 
      //var img = btoa(String.fromCharCode.apply(result, result)).replace(/.{1,76}/g, '$&\n'); 

      //$("#visor-expedientes .wrapper").html("<object width=200 height=200 classid='CLSID:106E49CF-797A-11D2-81A2-00E02C015623'> <param name='src' value='tiffdocument.tif'> <param name='negative' value='yes'> <embed width=200 height=200 src='data:image/tiff;base64," + img + "' type='image/tiff'> </object>"); 

      //$("#visor-expedientes .wrapper").html("<iframe id='visor' src='data:image/tiff;base64," + img + "' />"); 

      $("#visor-expedientes").html("<embed id='visor' name='plugin' src='data:image/tiff;base64," + img + "' type='image/tiff'></embed>"); 
      //$('#visor-expedientes iframe').attr('src', 'data:image/tiff;base64,' + result); 


     }).fail(function (error) { 
      alert("error " + error.d); 
     }); 

上述方法只在Firefox壽工作,顯然有一個限制,可以有多大的字符串(顯然32kb的IE和Chrome,Firefox似乎也有這個限制,但它似乎允許更大的字符串)。所以目前tiff查看器只能在firefox上工作,我真的不想訴諸使用一個aspx頁面來「流」文件,我想繼續使用這個web服務,但是¿你會如何使它成爲iframe會消耗Web服務? ¿我如何將參數從iframe傳遞給Web服務(也就是我需要顯示的圖像的ID)。我試圖簡單地將Web服務url放在iframe的src字段上,但那也行不通。

在此先感謝。


PS:這可能是完全不相關的,但是,之前有人指出,ASMX是很「古老」我必須說,事情是使用框架2.0和Visual Basic這一點,即使客戶端我想把所有的東西都切換到最新的框架,我真的不能這樣做,因爲這是他們想要的這個開發的一部分,因爲他們能夠獲取代碼並「修復它」並維護它,如果他們需要,沒有付出任何努力去學習新的東西(哎呀,即使asmx對他們來說似乎是一個完全古怪的東西,所以我說爲了推進開發方法,如果只有一點點,我就說了。)

編輯

好吧,我繼續開始搜索最深的互聯網默默無聞,因此,我決定放棄並嘗試遷移到wcf,事情是,仍然沒有關於什麼的信息這個過程對於我來說能夠做我想做的事,換句話說,你將如何翻譯這個(這是他們當時正在做的事情):

ObtenerImagen。ASPX

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="ObtenerImagen.aspx.vb" Inherits="ObtenerImagen" ContentType="image/tiff" %> 

ObtenerImagen.aspx.vb

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
     Dim ls_rutaArchivo As String 
     Dim key As String 
     Dim lo_cryptUtil As New UtilSyc.Seguridad.Criptografia() 

     If Request.Params("ruta") Is Nothing Then 
      Throw New FormatException("La llave (ruta) debe ser una cadena válida") 
     Else 
      key = Request.Params("ruta") 
     End If 
     ls_rutaArchivo = lo_cryptUtil.Desencrit(key) 
     '13464354 
     Response.ContentType = "image/tiff" 
     Response.Clear() 
     Response.TransmitFile(ls_rutaArchivo) 


    End Sub 

,並通過與上述頁面src和文件「流回」的IFRAME的路徑添加一個iframe調用頁面請求參數。

function visorImagenes(id) { 
     $("#visor").html("<object width='75%' height='100%' classid='CLSID:106E49CF-797A-11D2-81A2-00E02C015623'> <param name='src' value='/Expedientes/ObtenerImagen.aspx?ruta=" + id + "'> <param name='negative' value='no'> <embed width='75%' height='100%' src='/Expedientes/ObtenerImagen.aspx?ruta=" + id + "' type='image/tiff'> </object>"); 
    } 

¿您將如何去將上面的aspx頁面轉換爲可以被同一個iframe使用的WCF?

與像所示的一個方法創建一個WCF Web服務:

+0

打開tiff並以pdf格式包裝。例如,如果圖像數據是ccittg4(b/w掃描),那麼做起來很簡單 – mplungjan

+0

您可以詳細說明這個過程嗎,我不知道如何做這個包裝你說。 –

回答

0

好,甚至儘管我不完全知道這樣做是做正確的方式,我通過執行以下解決我的問題如下:

<OperationContract> _ 
    <WebGet> _ 
    Sub ObtenerImagen() 
     Try 
      If IsLoggedin() Then 
       Dim ls_rutaArchivo As String 
       Dim key As String 
       Dim lo_cryptUtil As New UtilSyc.Seguridad.Criptografia() 
       HttpContext.Current.Response.ContentType = "image/tiff" 

       If HttpContext.Current.Request.Params("ruta") Is Nothing Then 
        Throw New FormatException("La llave (ruta) debe ser una cadena válida") 
       Else 
        key = HttpContext.Current.Request.Params("ruta") 
       End If 
       ls_rutaArchivo = lo_cryptUtil.Desencrit(key) 
       '13464354 
       HttpContext.Current.Response.Clear() 
       HttpContext.Current.Response.TransmitFile(ls_rutaArchivo) 

      End If 
     Catch e As Exception 

      Throw New Exception("La session a expirado") 

     End Try 
    End Sub 

,並使用以下行的結果添加到頁面:

$("#visor").html("<object width='75%' height='100%' classid='CLSID:106E49CF-797A-11D2-81A2-00E02C015623'> <param name='src' value='/Web_Service/CPP_Service.svc/ObtenerImagen?ruta=" + id + "'> <param name='negative' value='no'> <embed width='75%' height='100%' src='/Web_Service/CPP_Service.svc/ObtenerImagen?ruta=" + id + "' type='image/tiff'> </object>"); 

即使到現在還沒完全確信,如果這是做這樣的事情的正確方法這(如上所述)它確實工作並解決了我的問題。不想將這個標記作爲答案,因爲我寧願在完全解散這個話題之前學會如何以正確的方式做到這一點。