C# 将图像上载到WCF服务会减小图像大小,并且图像未打开
我正在尝试使用WCF服务上载图像和其他文件,图像和其他类型的文件正在成功上载。但我面临的问题是,当我上传几KB的图片时,它会被上传,并且我能够很好地打开它。但当图像大小很大时,就像我试图上传800KB的图像一样,只上传了10KB的图像,而且图像无法打开,或者图像已损坏 我的web.config如下所示:C# 将图像上载到WCF服务会减小图像大小,并且图像未打开,c#,asp.net,image,wcf,file-upload,C#,Asp.net,Image,Wcf,File Upload,我正在尝试使用WCF服务上载图像和其他文件,图像和其他类型的文件正在成功上载。但我面临的问题是,当我上传几KB的图片时,它会被上传,并且我能够很好地打开它。但当图像大小很大时,就像我试图上传800KB的图像一样,只上传了10KB的图像,而且图像无法打开,或者图像已损坏 我的web.config如下所示: <?xml version="1.0"?> <configuration> <appSettings> </appSettings>
<?xml version="1.0"?>
<configuration>
<appSettings>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="2097151" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service
name="ImageUploadingService.Service1"
behaviorConfiguration="MyServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
<endpoint address="" binding="webHttpBinding" contract="ImageUploadingService.IService1" behaviorConfiguration="web" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding
maxBufferPoolSize="2147483647000000"
maxReceivedMessageSize="2147483647000000"
maxBufferSize="2147483647" transferMode="StreamedRequest">
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostImage?fileName={fileName}&Ext={Ext}&Path={Path}", Method = "POST")]
string PostImage(Stream sm,string fileName,string Ext,string Path);
}
public class Service1 : IService1
{
public string PostImage(Stream stream, string fileName, string Ext, string Path)
{
byte[] buffer = new byte[10000];
stream.Read(buffer, 0, 10000);
FileStream f = new FileStream(Path+fileName , FileMode.OpenOrCreate);
f.Write(buffer, 0, buffer.Length);
f.Close();
stream.Close();
return "Recieved the image on server";
}
}
protected void btnUploadImage_Click(object sender, EventArgs e)
{
PostData();
}
public void PostData()
{
string FileName="";
string ext="";
try
{
byte[] fileToSend = null;
if (FileUpload1.HasFile)
{
ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
FileName = FileUpload1.FileName;
Stream stream = FileUpload1.FileContent;
stream.Seek(0, SeekOrigin.Begin);
fileToSend = new byte[stream.Length];
int count = 0;
while (count < stream.Length)
{
fileToSend[count++] = Convert.ToByte(stream.ReadByte());
}
}
//Here provide your service location url in below line. You need to host your service on server(IIS or which one you prefer)
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:49287/Service1.svc/PostImage?fileName="+FileName+"&Ext="+ ext +"&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\");//PostImage?fileName={fileName}&Ext={Ext}&Path={Path}
req.Method = "POST";
req.ContentType = "application/octet-stream";
req.ContentLength = fileToSend.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(fileToSend, 0, fileToSend.Length);
reqStream.Close();
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
string result = reader.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
}
我的服务课是这样的:
<?xml version="1.0"?>
<configuration>
<appSettings>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="2097151" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service
name="ImageUploadingService.Service1"
behaviorConfiguration="MyServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
<endpoint address="" binding="webHttpBinding" contract="ImageUploadingService.IService1" behaviorConfiguration="web" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding
maxBufferPoolSize="2147483647000000"
maxReceivedMessageSize="2147483647000000"
maxBufferSize="2147483647" transferMode="StreamedRequest">
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostImage?fileName={fileName}&Ext={Ext}&Path={Path}", Method = "POST")]
string PostImage(Stream sm,string fileName,string Ext,string Path);
}
public class Service1 : IService1
{
public string PostImage(Stream stream, string fileName, string Ext, string Path)
{
byte[] buffer = new byte[10000];
stream.Read(buffer, 0, 10000);
FileStream f = new FileStream(Path+fileName , FileMode.OpenOrCreate);
f.Write(buffer, 0, buffer.Length);
f.Close();
stream.Close();
return "Recieved the image on server";
}
}
protected void btnUploadImage_Click(object sender, EventArgs e)
{
PostData();
}
public void PostData()
{
string FileName="";
string ext="";
try
{
byte[] fileToSend = null;
if (FileUpload1.HasFile)
{
ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
FileName = FileUpload1.FileName;
Stream stream = FileUpload1.FileContent;
stream.Seek(0, SeekOrigin.Begin);
fileToSend = new byte[stream.Length];
int count = 0;
while (count < stream.Length)
{
fileToSend[count++] = Convert.ToByte(stream.ReadByte());
}
}
//Here provide your service location url in below line. You need to host your service on server(IIS or which one you prefer)
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:49287/Service1.svc/PostImage?fileName="+FileName+"&Ext="+ ext +"&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\");//PostImage?fileName={fileName}&Ext={Ext}&Path={Path}
req.Method = "POST";
req.ContentType = "application/octet-stream";
req.ContentLength = fileToSend.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(fileToSend, 0, fileToSend.Length);
reqStream.Close();
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
string result = reader.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
}
我要上传的代码如下:
<?xml version="1.0"?>
<configuration>
<appSettings>
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="2097151" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service
name="ImageUploadingService.Service1"
behaviorConfiguration="MyServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>
</host>
<endpoint address="" binding="webHttpBinding" contract="ImageUploadingService.IService1" behaviorConfiguration="web" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding
maxBufferPoolSize="2147483647000000"
maxReceivedMessageSize="2147483647000000"
maxBufferSize="2147483647" transferMode="StreamedRequest">
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, UriTemplate = "PostImage?fileName={fileName}&Ext={Ext}&Path={Path}", Method = "POST")]
string PostImage(Stream sm,string fileName,string Ext,string Path);
}
public class Service1 : IService1
{
public string PostImage(Stream stream, string fileName, string Ext, string Path)
{
byte[] buffer = new byte[10000];
stream.Read(buffer, 0, 10000);
FileStream f = new FileStream(Path+fileName , FileMode.OpenOrCreate);
f.Write(buffer, 0, buffer.Length);
f.Close();
stream.Close();
return "Recieved the image on server";
}
}
protected void btnUploadImage_Click(object sender, EventArgs e)
{
PostData();
}
public void PostData()
{
string FileName="";
string ext="";
try
{
byte[] fileToSend = null;
if (FileUpload1.HasFile)
{
ext = System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
FileName = FileUpload1.FileName;
Stream stream = FileUpload1.FileContent;
stream.Seek(0, SeekOrigin.Begin);
fileToSend = new byte[stream.Length];
int count = 0;
while (count < stream.Length)
{
fileToSend[count++] = Convert.ToByte(stream.ReadByte());
}
}
//Here provide your service location url in below line. You need to host your service on server(IIS or which one you prefer)
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:49287/Service1.svc/PostImage?fileName="+FileName+"&Ext="+ ext +"&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\");//PostImage?fileName={fileName}&Ext={Ext}&Path={Path}
req.Method = "POST";
req.ContentType = "application/octet-stream";
req.ContentLength = fileToSend.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(fileToSend, 0, fileToSend.Length);
reqStream.Close();
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
string result = reader.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
}
protectedvoid btnUploadImage\u单击(对象发送方,事件参数e)
{
PostData();
}
public void PostData()
{
字符串FileName=“”;
字符串ext=“”;
尝试
{
字节[]fileToSend=null;
if(FileUpload1.HasFile)
{
ext=System.IO.Path.GetExtension(this.FileUpload1.PostedFile.FileName);
FileName=FileUpload1.FileName;
Stream=文件上传1.FileContent;
stream.Seek(0,SeekOrigin.Begin);
fileToSend=新字节[stream.Length];
整数计数=0;
while(计数<流长度)
{
fileToSend[count++]=Convert.ToByte(stream.ReadByte());
}
}
//在下面的行中提供您的服务位置url。您需要在服务器(IIS或您喜欢的服务器)上托管您的服务
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(“http://localhost:49287/Service1.svc/PostImage?fileName=“+FileName+”&Ext=“+Ext+”&Path=C:\\Users\\mubashir.gul\\Documents\\mydocs\\”;//PostImage?FileName={FileName}&Ext={Ext}&Path={Path}”
请求方法=“POST”;
req.ContentType=“应用程序/八位字节流”;
req.ContentLength=fileToSend.Length;
Stream reqStream=req.GetRequestStream();
请求流写入(fileToSend,0,fileToSend.Length);
reqStream.Close();
HttpWebResponse resp=(HttpWebResponse)req.GetResponse();
StreamReader=新的StreamReader(resp.GetResponseStream());
字符串结果=reader.ReadToEnd();
}
捕获(例外情况除外)
{
掷骰子;
}
}
任何类型的建议都将不胜感激。您的服务代码包含以下行:
byte[] buffer = new byte[10000];
stream.Read(buffer, 0, 10000);
你说的是大约10KB
尝试将服务方法更改为以下内容:
FileStream f = new FileStream(Path+fileName , FileMode.OpenOrCreate);
stream.CopyTo(f);
f.Close();
stream.Close();
非常感谢@Igor..工作顺利..但当我选择超过20mb的文件时页面崩溃…请提供任何建议。我打赌你可能会遇到一些超时。据我所知,您会遇到一些异常(您必须尝试/捕获代码)。你能把你遇到的例外情况发出来吗?这样我就能更好地告诉你如何处理它了。