2015-10-01 64 views
0

我現在有一個Web服務設置的上傳和使用下面的代碼保存文件(PNG圖片)到我的網站:上傳圖片ASP.NET網站與avalible內容類型

[WebMethod] 
public string SaveDocument(byte[] docbinaryarray, string docname) 
{ 
    string strdocPath; 
    string docDirPath = Server.MapPath("\\") + uploadDir; 
    strdocPath = docDirPath + docname; 
    if (!Directory.Exists(docDirPath)) 
     Directory.CreateDirectory(docDirPath); 
    FileStream objfilestream = new FileStream(strdocPath, FileMode.Create, FileAccess.ReadWrite); 
    objfilestream.Write(docbinaryarray, 0, docbinaryarray.Length); 
    objfilestream.Close(); 
    return "http:\\\\example.com\\" + uploadDir + docname;  
} 

這代碼工作正常,但是當我通過url訪問圖像時,我沒有得到與png文件(image/png)匹配的內容類型。當您上傳文件時是否可以關聯內容類型,以便在您訪問url(example.com/myimage.png)時返回帶有圖像/ png內容類型的圖像?或者我需要以某種方式動態創建鏈接到這些鏈接的內容類型的網頁?

編輯: 我們的目標是與第三方的API,需要做一個GET請求,需要知道的內容類型使用,現在它指定爲無效。

回答

0

我想出了問題。即使設置了內容類型標題,文件也不會作爲圖像讀取,而只能作爲文件讀取。這是我使用的第三方API沒有正確閱讀並抱怨內容類型。該修復最終將chaning我的方法如下:

[WebMethod] 
     public string SaveImage(byte[] docbinaryarray, string docname) 
     { 
      string strdocPath; 
      string docDirPath = Server.MapPath("/") + uploadDir; 
      strdocPath = docDirPath + docname; 
      if (!Directory.Exists(docDirPath)) 
       Directory.CreateDirectory(docDirPath); 
      using (Image image = Image.FromStream(new MemoryStream(docbinaryarray))) 
      { 
       image.Save(strdocPath, ImageFormat.Png); // Or Png 
      } 
      return "http://example.com/" + uploadDir + docname; 

     } 
0

我認爲有些東西在您的Web服務器中沒有很好的配置以阻止文件或者將錯誤的文件名傳遞給這個Web服務方法。

我測試了它,並寫了簡單的實現,並運行良好。 ASP.NET頁面將圖像上傳到Web服務,Web服務返回上傳圖像的URL,頁面通過Image1控件顯示圖像。

我簡單的實現:

的Default.aspx:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form runat="server"> 
    <asp:FileUpload ID="FileUpload1" runat="server" /> 
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_OnClick" /> 
    <asp:Image ID="Image1" runat="server" /> 
    </form> 
</body> 
</html> 

Default.aspx.cs:

namespace TestAspNetWebApp 
{ 
    using System.IO; 
    using System; 

    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_OnClick(object sender, EventArgs e) 
     { 
      string appPath = Request.PhysicalApplicationPath + "\\uploads\\"; 

      if (!Directory.Exists(appPath)) 
       Directory.CreateDirectory(appPath); 

      if (FileUpload1.HasFile) 
      { 
       string savePath = appPath + Server.HtmlEncode(FileUpload1.FileName); 
       FileUpload1.SaveAs(savePath); 

       using (var objfilestream = new FileStream(savePath, FileMode.Open, FileAccess.Read)) 
       { 
        var len = (int) objfilestream.Length; 
        var mybytearray = new Byte[len]; 
        objfilestream.Read(mybytearray, 0, len); 

        var myservice = new WebService(); 
        var fileurl = myservice.SaveDocument(mybytearray, FileUpload1.FileName); 
        Image1.ImageUrl = fileurl; 
       } 

       File.Delete(savePath); 
      } 
     } 
    } 
} 

WebService.asmx.cs:

namespace TestAspNetWebApp 
{ 
    using System.IO; 
    using System.Web.Services; 

    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 

    public class WebService : System.Web.Services.WebService 
    { 
     private const string uploadDir = "uploads-websevice"; 

     [WebMethod] 
     public string SaveDocument(byte[] docbinaryarray, string docname) 
     { 
      string strdocPath; 

      string docDirPath = Server.MapPath("\\") + uploadDir + "\\"; 
      strdocPath = docDirPath + docname; 

      if (!Directory.Exists(docDirPath)) 
       Directory.CreateDirectory(docDirPath); 

      var objfilestream = new FileStream(strdocPath, FileMode.Create, FileAccess.ReadWrite); 
      objfilestream.Write(docbinaryarray, 0, docbinaryarray.Length); 
      objfilestream.Close(); 

      return "http://localhost:57064/" + uploadDir + "/" + docname; 
     } 
    } 
} 
+0

我上傳文件很好,它顯示爲一個圖像罰款。問題是沒有與圖像關聯的內容類型響應標頭,所以我無法從需要內容類型的API訪問它。 –

+0

感謝您的評論。從原來的帖子,不明確。你怎麼試圖從服務器拉圖像,它不返回內容類型。我嘗試從瀏覽器和小提琴手,所有的作品都很好。看看這個屏幕,看看結果http://i.imgur.com/2ta0JVR.png –

+0

我用代碼的例子添加了另一個答案,請嘗試檢查它,並將您的代碼添加到帖子。 –

0

請添加一些代碼示例以幫助您定義問題並解決問題。

看起來,服務器像往常一樣返回所有的頭和'內容類型'。

using (var client = new WebClient()) 
{ 
     string uri = "http://chronicletwilio.azurewebsites.net/res/12345.png"; 
     byte[] data = client.DownloadData(uri); 
     string contentType = client.ResponseHeaders["content-type"]; 
     // contentType is 'image/png' 
}