使用可用的内容类型将图像上传到ASP.NET站点

时间:2015-10-01 17:50:17

标签: asp.net content-type

我目前设置了一个网络服务,使用以下代码将文件(.png图像)上传并保存到我的网站:

[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)时返回带有image / png内容类型的图像?或者我是否需要以某种方式动态创建具有链接到这些链接的内容类型的网页?

修改 目标是将此与第三方API一起使用,该第三方API需要执行GET请求并且需要知道内容类型,现在它指定为无效。

3 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:0)

请添加一些代码示例,以帮助您定义问题并解决问题。

似乎服务器像往常一样返回所有标题和'Content-type'。

Bar

答案 2 :(得分:0)

我弄明白了这个问题。即使设置了内容类型标头,该文件也不会被读取为图像,而只是作为文件读取。就是这种情况,我使用的第三方API没有正确阅读它并抱怨内容类型。该修复程序最终将我的方法修改为以下内容:

[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;

        }