1. 程式人生 > >通過WebClient的Postdata將上傳檔案功能放到另一個網站上去操作

通過WebClient的Postdata將上傳檔案功能放到另一個網站上去操作

看了本文的標題,可能很多人不太明白,其實這裡講的只是一個簡單的處理辦法。
以前做的上傳檔案也是分離的,上傳後的檔案存在一個檔案伺服器上面,這個應該很多人都會。
今天我這裡提的是分離上傳功能,因為上傳過程也是一個佔用伺服器資源的大問題,如果能夠把它和網站分開,哪效果應該會有很大的提升。
先看這個圖:


A 層是我們的使用者表單,如一個簡單的修改使用者資訊頁面
B 層也是一個網站,它是一個上傳功能。
C 層是存放檔案的伺服器

B網站可以是一臺獨立的網站伺服器,它做的事情就只是上傳,並處理檔案,如:切割圖片、銳化圖片等功能。當A網站需要上傳功能時,就可以通過一個iframe去呼叫B網站的上傳頁面,兩者之間通過JS的Parent來傳遞資料(具體做法請看我以前寫的《》)。
但今天有個功能卻不能用這種方式做,不能使用iframe,所以一直想了好幾個辦法,最終做了一個通過WebClient來將檔案資料POST到B伺服器,B伺服器再處理,並儲存。這種做法雖然效果沒有達到完全的分離(上傳時A網站還是要將檔案資訊從使用者的本地讀到A網站的伺服器),不過處理檔案的資源已經分開了,速度上面應該會有些好的(看具體情況了,我這裡會將檔案縮小並切割成好幾種不同大小的格式,再將切割完成的圖進行銳化處理)。
我一直在想,怎麼才能將Ajax一樣,直接把資訊POST到B網站的一個頁面上,終於找到WebClient,我先把檔案讀成Byte陣列,再用WebClient提交到B伺服器的頁面上,B服務接收此資訊並轉成一個Image,然後處理檔案並儲存,最後返回結果。

再看一下具體的程式碼:

A層頁面程式碼的Default.aspx:
<%
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%><!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 id="form1" runat="server"><asp:FileUpload ID="file1" runat="server"/><asp:Button ID="btnPost" runat="server" Text="上傳" OnClick="btnPost_Click"/></form></body></html>
A層服務端程式碼 Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

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

    }

    
protectedvoid btnPost_Click(object sender, EventArgs e)
    {
        
if(! file1.HasFile)
        {
            Alert(
"還未選擇要上傳的檔案.");
            
return;
        }

        HttpPostedFile myFile 
= file1.PostedFile;

        
string result ="";

        
try
        {
            
            
//將檔案轉換成位元組形式byte[] fileByte =newbyte[myFile.InputStream.Length];
            myFile.InputStream.Read(fileByte, 
0, fileByte.Length);

            
//通過WebClient類來提交檔案資料

            
//定義提交URL地址,它會接收檔案的位元組資料,並儲存,再返回相應的結果[此處具體用的時候要修改]string postUrl ="http://localhost:2956/Upload/uploadpic.aspx?oldfilename="+ myFile.FileName;
            System.Net.WebClient webClient 
=new System.Net.WebClient();
            
byte[] responseArray = webClient.UploadData(postUrl, "POST", fileByte);

            
//將返回的位元組資料轉成字串(也就是uploadpic.aspx裡面的頁面輸出內容)            result = System.Text.Encoding.Default.GetString(responseArray, 0, responseArray.Length);

            
//返回結果的處理switch (result)
            {
                
case"-1":
                    Alert(
"上傳頭像時發生異常,未提交成功。");
                    
return;
                
case"0":
                    Alert(
"您還未選擇頭像。");
                    
return;
            }
        }
        
catch (Exception ex)
        {
            Response.Write(ex.Message);
            
return;
        }

        Alert(
"上傳成功!/r/n結果是:"+ result);
    }

    
#region 在客戶端發出Alert提示視窗///<summary>/// sumary:彈出一個提示視窗
    
///</summary>///<param name="msg">提示資訊</param>///<param name="url">要專向的地址,不轉請傳空字串</param>publicvoid Alert(string msg, string url)
    {

        
string goUrlScript ="";
        
if (url !="")
        {
            goUrlScript 
="document.location.href='"+ url +"';";
        }
        Page.RegisterStartupScript(
"alert""<script type='text/javascript'>alert('"+ msg +"');"+ goUrlScript +"</script>");
    }

    
///<summary>/// 彈出錯誤提示
    
///</summary>///<param name="msg">提示資訊,支援HTML</param>publicvoid Alert(string msg)
    {
        Alert(msg, 
"");
    }

    
#endregion
}


B層的服務端程式碼 UploadPic.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;

public partial class uploadpic : System.Web.UI.Page
{
    
privatestring SavePath =@"c:/uploadfiles";
    
privatestring UrlFilePath ="/UserHead/";
    
protectedvoid Page_Load(object sender, EventArgs e)
    {
        initPage();
    }

    
privatevoid initPage()
    {
        
if (Request.InputStream.Length ==0)
        {
            
//沒有內容            Response.Write("0");
            
return;
        }

        
//HttpPostedFile myFile = Request.Files[0];  string OldFileName =this.GetQueryString("oldfilename");
        
string DirPath = GetDataPath();
        
string RealSavePath = SavePath +"//"+ DirPath +"//";
        
string fileExt ="jpg";
        
if (OldFileName !="")
        {
            fileExt 
= OldFileName.Substring(OldFileName.LastIndexOf("."+1);
        }
        
string NewFileName = GetFileName(fileExt);
        System.Drawing.Image postImage 
= System.Drawing.Image.FromStream(Request.InputStream);
        
try
        {
            
if (!Directory.Exists(RealSavePath))
            {
                System.IO.Directory.CreateDirectory(RealSavePath);
            }

            MakeSmallImage(postImage, RealSavePath, NewFileName);

            Response.Write(UrlFilePath 
+ DirPath +"/"+ NewFileName);
        }
        
catch (Exception ex)
        {
            Response.Write(
"-1");
        }




    }

    
///<summary>/// 生成縮微圖
    
///</summary>///<param name="p_PostFile"></param>///<param name="p_SaveFileName">儲存的檔名,包括目錄地址</param>privatevoid MakeSmallImage(System.Drawing.Image imageBase, string p_SavePath, string p_FileName)
    {
        
try
        {
            System.Drawing.Bitmap bitmap_b 
=new System.Drawing.Bitmap(imageBase);

            
//儲存            bitmap_b.Save(p_SavePath +"/"+ p_FileName, System.Drawing.Imaging.ImageFormat.Jpeg);

        }
        
catch (Exception ex)
        {
            
thrownew Exception(ex.ToString());
        }
    }

    
publicstring GetFileName(string FileType)
    {
        System.Random Rd 
=new Random();
        
double Rds = Rd.NextDouble();
        
string nowTime = System.DateTime.Now.ToString();
        nowTime 
= nowTime.Replace("""");
        nowTime 
= nowTime.Replace("-""");
        nowTime 
= nowTime.Replace(":""");
        nowTime 
= nowTime.Trim() +"_"+ Rds.ToString().Replace(".""").Substring(04);
        nowTime 
= nowTime +"."+ FileType.ToLower();
        
return nowTime;
    }

    
publicstring GetDataPath()
    {
        
string nowTime = System.DateTime.Now.ToShortDateString().Trim();
        
return nowTime;
    }

    
#region 獲取QueryString的值///<summary>/// sumary:獲取QueryString的值

    
///</summary>///<param name="key">QueryString中欄位的名稱</param>///<returns>/// 如果存在則返回QueryString中欄位對應的值 如果不存在或異常,則返回空字串
    
///</returns>publicstring GetQueryString(string key)
    {
        
try
        {
            
string value =string.Empty;
            
if (HttpContext.Current.Request.QueryString[key] !=null)
            {
                value 
= HttpContext.Current.Request.QueryString[key].ToString();
            }
            
return value;
        }
        
catch
        {
            
returnstring.Empty;
        }
    }
    
#endregion
}

完整原始碼下載地址:http://www.cnblogs.com/Files/huacn/HttpPostFile.7z
 

相關推薦

通過WebClient的Postdata檔案功能放到一個網站上去操作

看了本文的標題,可能很多人不太明白,其實這裡講的只是一個簡單的處理辦法。以前做的上傳檔案也是分離的,上傳後的檔案存在一個檔案伺服器上面,這個應該很多人都會。今天我這裡提的是分離上傳功能,因為上傳過程也是一個佔用伺服器資源的大問題,如果能夠把它和網站分開,哪效果應該會有很大的提

H5 通過Ajax方式檔案 使用FormData進行Ajax請求

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PHP圖片自動縮到指定解析度,保持清晰度

class AutoImage{ private $image; public function resize($src, $width, $height){ //$src 就是 $_FILES['upload_image_file']['tmp_name']

selenium通過send_keys方法檔案

測試專案中遇到上傳檔案時開啟windows視窗的問題,為了定位windows視窗,引入了pywin32. 如果利用pywin32需要import win32gui,win32con,win32api,還有比較難懂的程式碼,如下: handle=win32gui.FindWindow("#32770"

Laravel 5.5 簡單檔案功能

遇到一點點坑... 馬克一下 直接上程式碼吧 首先需要設定配置檔案:config/filesystems.php   'public' => [ 'driver' => 'local', 'root' => public_path('upl

java 後臺通過post請求 檔案

文章轉載:https://blog.csdn.net/wohaqiyi/article/details/77621517   import microservice.fpzj.control.base.BaseController; import org.springframewo

spring mvc檔案功能

在web開發中,我們經常需要上傳檔案。檔案上傳在html裡通過表單來提交,但是後臺是如何獲取檔案的呢? MultipartHttpServletRequest multipartHttpServletRequest = (MultipartH

Java程式碼中如何通過 http來檔案

例子程式碼如下 package example.filetransfer; import java.io.*; import java.net.*; import java.util.*; public class HttpRequestUtil { /** * 傳送ge

通過 HTTP POST 檔案到伺服器

2. 上傳之前使用者無法預知上傳檔案的數目. 3. 因為是 ASP.NET 應用, 客戶端可能沒有裝 .NET Framework. 其實,我們知道.如果要跟 IE 端客戶檔案系統互動的話,程式碼必須在客戶端執行. 這個時候我們可以寫一個 Activex 控制元件來實現選擇資料夾和上傳. 一般我們常用兩種方

通過POST請求檔案

轉自:https://blog.csdn.net/zhangge3663/article/details/81218488 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表達提交的,程式碼如下:

js方法實現--檔案功能js實現

unction createUploadForm(fileElementId, data, curFileList) { var id = new Date().getTime(); var formId = 'jUploadForm' + id; //給form新增一個獨一

httpclient通過POST來檔案,而不是通過流的形式,並在服務端進行解析(通過httpmime.jar來操作)

1. 首先需要對應的JAR包 匯入 httpmime-4.1.1.jar。 package url; import io.IoStreamUtil; import java.io.File; import java.io.IOException; import jav

Nodejs學習筆記(八)--- Node.js + Express 實現檔案功能(felixge/node-formidable)

目錄 前言   前面講了一個構建網站的示例,這次在此基礎上再說說web的常規功能----檔案上傳,示例以一個上傳圖片的功能為例子   上傳功能命名用formidable實現,示例很簡單!   PS:最近比較忙,距上一次更新已經比較久了^_^! formidable簡介   nodejs

如何通過xshell 來檔案至linux

在linux安裝 yum -y install lrzsz  在xshell  輸入rz回車即可彈出輸入檔案框找到要傳到Linux的檔案確定即可 要是Linux傳出到windows 在li

python 通過post方式檔案到php伺服器

看了網上很多程式碼,都沒有說如何具體的使用poster,試了兩天,終於成功了 通過python呼叫php實現了檔案上傳 與大家分享一下:     首先要通過pip安裝poster(easy_install 也是一樣的):

springMVC筆記系列(21)——springMVC自帶的檔案功能實現

springMVC為我們提供了上傳檔案的內部支援,我們只需要一些配置,然後就可以藉助於sprinngMVC提供給我們的介面完成檔案上傳的工作。 首選找到與springMVC的前端控制器DispatchServlet相關的上下文,即\WEB-INF\conf

Spring Cloud中FeignClient新增檔案功能

專案概況:Spring Cloud搭的微服務,使用了eureka,FeignClient,現在遇到FeignClient呼叫介面時不支援上傳檔案,百度到兩種方案,一種是使用feign-form和feign-form-spring庫來做,原始碼地址:https://github

Servlet 通過表單檔案和獲取表單資料的最簡單方式

注意:本文所描述的方法需要Servlet 3.0 及以上版本的支援。 一、伺服器端Servlet程式碼: import javax.servlet.ServletException; imp

使用Nginx Upload Module實現檔案功能

普通網站在實現檔案上傳功能的時候,一般是使用Python,Java等後端程式實現,比較麻煩。Nginx有一個Upload模組,可以非常簡單的實現檔案上傳功能。此模組的原理是先把使用者上傳的檔案儲存到臨時檔案,然後在交由後臺頁面處理,並且把檔案的原名,上傳後的名稱

如何檔案的瀏覽按鈕修改為自定義按鈕

  大致思想就是:將真的file進行隱藏,使用普通的text和button拼接成我們的檔案上傳樣式。然後設定button的onclick事件,該事件響應的是又是file的click事件,最後設定file的onchange事件,當file改變時將file的value值填充到t