用fileupload控件上传文件到apicloud数据库中,不说闲话。直接看代码
前台代码如下
<asp:Image ID="Recipe_ImageUrl" runat="server" ImageUrl=""/>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="上传" OnClick="FileUpload"/>
后台代码如下
protected void FileUpload(object sender, EventArgs e)
{
string fileName = FileUpload1.PostedFile.FileName;//获取fileupload控件选择的文件名
if (fileName != "")
{
fileName = DateTime.Now.Ticks.ToString() + "_" + fileName;
FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Backstage/UploadImageTemp/" + fileName));//上传文件本地服务器
UploadFile(Server.MapPath("~/Backstage/UploadImageTemp/" + fileName));
}
else
{
MyClass.ShowMessage(this.Page, "未选择图片!");
}
}
private string UploadFile(string fileNamePath)
{
System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileNamePath);
if (!fileInfo.Exists)
{
MyClass.ShowMessage(this.Page, "文件不存在!");
return "";
}
// 要上传的文件
FileStream fs = fileInfo.OpenRead();
BinaryReader BinaryReaderTemp = new BinaryReader(fs);
//时间戳
string strBoundary = "---------" + DateTime.Now.Ticks.ToString("x");
//上传URL ,这里因为是apicloud所以写死,如果是上传到其他,可以修改
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri("http://d.apicloud.com/mcm/api/file"));
httpReq.Timeout = timeout;
httpReq.ReadWriteTimeout = readWriteTimeout;
httpReq.Method = "POST";
httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
httpReq.Headers.Add("X-APICloud-AppId", ****);//输入你的appid
httpReq.Headers.Add("X-APICloud-AppKey", ****);//输入你的appkey(SHA1加密后)
FileSendObj fso = new FileSendObj();
try
{
//请求头部信息
StringBuilder sbPostHeader = new StringBuilder();
sbPostHeader.Append("--" + strBoundary);
sbPostHeader.Append("\r\n");
sbPostHeader.Append("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileInfo.Name + "\"");//新文件名
sbPostHeader.Append("\r\n");
sbPostHeader.Append("Content-Type: " + GetMimeType(fileInfo.Name));//文件类型 text/plain image/jpeg 或者其他
sbPostHeader.Append("\r\n");
sbPostHeader.Append("\r\n");
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbPostHeader.ToString());
Stream postStream = httpReq.GetRequestStream();
fso.connection = true;
fso.totalBytes = fs.Length;//数据总大小
//发送请求头部消息
postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
//已上传的字节数
long offset = 0;
int size = 0;
//每次上传1k
byte[] buffer = new byte[1024];
do
{
size = BinaryReaderTemp.Read(buffer, 0, buffer.Length);
if (size <= 0 && offset <= 0)
{
fso.connection = false;
//ShowDownloadedInfo(fso);//可以回调进度
break;
}
offset += size;
postStream.Write(buffer, 0, size);
//ShowDownloadedInfo(fso);//可以回调进度
} while (size > 0);
//添加尾部的时间戳
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
postStream.Close();
//获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
StreamReader sr = new StreamReader(s);
//读取服务器端返回的消息
MyClass.ShowMessage(this.Page, "上传成功!");
String sReturnString = sr.ReadToEnd();
JObject o = JObject.Parse(sReturnString);
Recipe_ImageUrl.ImageUrl = (o.SelectToken("url")).ToString();
s.Close();
sr.Close();
return sReturnString;
}
catch
{
fso.connection = false;
//ShowDownloadedInfo(fso);//可以回调进度
return "";
}
finally
{
fs.Close();
BinaryReaderTemp.Close();
}
}
public static string GetMimeType(string fileName)
{//访问注册表获取的
string mimeType = "application/unknown";
string ext = Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
{
mimeType = regKey.GetValue("Content Type").ToString();
}
return mimeType;
}
class FileSendObj
{
/// <summary>
/// 文件总大小
/// </summary>
public long totalBytes = 0;
/// <summary>
/// 文件已下载多少
/// </summary>
public long totalDownloadedByte = 0;
/// <summary>
/// 连接是否成功
/// </summary>
public bool connection = false;
}