Odeslaná data přes httpwebrequest post metodou – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Odeslaná data přes httpwebrequest post metodou – .NET – Fórum – Programujte.comOdeslaná data přes httpwebrequest post metodou – .NET – Fórum – Programujte.com

 

ejtix-1
Newbie
1. 2. 2010   #1
-
0
-

Ahoj, prosim o radu, jedna se o upload na server post metodou, kod mi funguje, ale nejde mi vytahnout pocet odeslanych dat behem uploadu, stacilo by procentualni vyjadreni backgroundworkeru ale to se da pocitat asi taky jen prave treba poctem prenesenych dat, existuje nejaka metoda pro webresponse(doufam ze prave to odesila data na server) progresschange(teda v msdn knihovne sem ji nenasel)?nebo vite o nejaky lepsi metode jak na http upload post metodou? diky Honza :



using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Collections.Specialized;
using System.Threading;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace upload_WithDetails
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}
private delegate void UpdateProgessCallback(Int64 BytesRead, Int64 TotalBytes);


public void UploadFilesToRemoteUrl(string url, string file, string logpath, NameValueCollection nvc)
{
FileInfo f = new FileInfo("FilePath");

Int64 fileSize = f.Length;
long length = 0;
string boundary = "----------------------------" +
DateTime.Now.Ticks.ToString("x");


HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest2.ContentType = "multipart/form-data; boundary=" +
boundary;
httpWebRequest2.Method = "POST";
httpWebRequest2.KeepAlive = true;
httpWebRequest2.Credentials =
System.Net.CredentialCache.DefaultCredentials;



Stream memStream = new System.IO.MemoryStream();

byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
boundary + "\r\n");
string formdataTemplate = "\r\n--" +/* boundary +*/ "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

foreach (string key in nvc.Keys)
{
string formitem = string.Format(formdataTemplate, key, nvc[key]);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
memStream.Write(formitembytes, 0, formitembytes.Length);
}


memStream.Write(boundarybytes, 0, boundarybytes.Length);

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";

string header = string.Format(headerTemplate,
"form_upload", file);

byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);


memStream.Write(headerbytes, 0, headerbytes.Length);


FileStream fileStream = new FileStream(file, FileMode.Open,
FileAccess.Read);
byte[] buffer = new byte[2048];

int bytesRead = 0;

while ((bytesRead = fileStream.Read(buffer, 0,
buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}


memStream.Write(boundarybytes, 0, boundarybytes.Length);

fileStream.Close();

httpWebRequest2.ContentLength = memStream.Length;

Stream requestStream = httpWebRequest2.GetRequestStream();

memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];

memStream.Read(tempBuffer, 0, tempBuffer.Length);

memStream.Close();

requestStream.Write(tempBuffer, 0,
tempBuffer.Length);

requestStream.Close();


WebResponse webResponse2 = httpWebRequest2.GetResponse();

Stream stream2 = webResponse2.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);

webResponse2.Close();
httpWebRequest2 = null;
webResponse2 = null;


}

private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}

NameValueCollection myCol = new NameValueCollection();
string file;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
myCol.Add("FileName", "1");
file = "FilePath";
UploadFilesToRemoteUrl("http://up.uloz.to/ul/upload.cgi?tmp_sid=55fb51479a2ab312909cb47756ed3795&user_id=277895&host=uloz.to",
file, "FolderPath", myCol);

}

private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{

}

}
}

Nahlásit jako SPAM
IP: 62.168.43.–
LiborBes
~ Anonymní uživatel
47 příspěvků
1. 2. 2010   #2
-
0
-

No, nie som si isty, ci toto ma M$ odmakane (takze problem popisem z mojho pohladu - teda neviem povedat, ci ten tvoj je nespravny), ale tvoj priklad (s backgroundowrkerom) vyzera skor okopceny z desktopovej aplikacie. Background worker vytvori separovany tread, co nie je problem si "napisat" aj sam, na webe mas iny problem - vytvorit callback na klienta.

Web je klient-server architektura. Upload suboru na server, znamena, ze z klienta zacnes citat data, ktore postupne (v JEDNOM requeste) posielas na server. Ty chces ale zo servera na klienta vratit stav, napr. ze uz je skopirovanych 10%. Co sa teda stane, klient ma otvoreny request a prijma response pred ukoncenim requestu? Kvoli tomu musis odmakat posielanie suboru a prijimanie "stavov" oddelene. Tu je starsi priklad, akoby to mohlo fungovat:

http://www.brettle.com/Demo.aspx

Typickym prikladom pre web je napr. synchronizacia B2B aplikacii, ktora vytazuje server. Klient v takom pripade nevidi nic, len ze sa stranka "natahuje" - to su vlastne time-outy, v ktorych sa serveru opyta, "ci uz neskoncil" s renderovanim stranky. Ak takuto fciu hodi do threadu (server thread), klient moze dostavat ciastkovy stav (nie ci uz neskoncil, ale progress stav - kde sa prave nachadza). Na to sa pouzije napr. javascriptove volanie v cykle o "odpoved" (klient thread) - toto ma vyhodu, klient takto nedostane time-out napr. z proxy servera (nie len session time-out z aplikacneho servera).

Ak vlastne pochopis tuto filozofiu - potom mozes zacat kombinovat tuto techniku napr. s Ajaxom:

http://geekswithblogs.net/rashid/archive/2007/08/01/Create-An-Ajax-Style-File-Upload.aspx

Toto funguje v podstate podobne - na strane klienta sa zavesi "thread" ktory sa asynchronne pyta servera, v akom je stave a podla toho vykresluje progressbar (neskusal som to, neviem ci funguje).

Nahlásit jako SPAM
IP: 88.212.35.–
ejtix-1
Newbie
2. 2. 2010   #3
-
0
-

Ahoj, dekuju za odpoved, ja tak nejak doufam ze se mi povede ten requeststream writer rozdelit s webresponse a odesilat data po urcitem poctu bajtu , ale vubec nevim jestli to server vezme a napoji data k sobe? Myslis , ze je mozne timto zpusobem odesilat data a tim tak zaroven zjistovat klik se jich jiz odeslalo?

Nahlásit jako SPAM
IP: 78.102.97.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 41 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý