2011-01-25 26 views
7

ASMX Webサービス(WCFなし、理由は問いません)を使用して、ローカルファイルシステムからサーバー内のフォルダにファイルをアップロードする方法はありますか?ASMXファイルのアップロード

[WebMethod] 
public void Upload(byte[] contents, string filename) 
{ 
    var appData = Server.MapPath("~/App_Data"); 
    var file = Path.Combine(appData, Path.GetFileName(filename)); 
    File.WriteAllBytes(file, contents); 
} 

は、その後、サービスを公開するWSDLからクライアントプロキシを生成し、標準的なものを呼び出します。

UPD

PSfileサイズは

答えて

2

大きなファイルをサーバーにアップロードするための無料ツールを開発する際には、.NET 2.0とWebサービスも使用しています。

非常に大きなファイルに対してアプリケーションのエラー耐性を向上させるために、1つの大きなbyte[]アレイをアップロードせず、代わりに「チャンク」アップロードを行うことにしました。

I.e. 1 MBのファイルをアップロードするために、アップロードSOAP関数を20回呼びます。それぞれの呼び出しは、byte[]配列50 KBを渡し、サーバー上で再び連結します。

私もパッケージを数えます。1滴が落ちたら、何度かそれをアップロードしようとします。

これにより、アップロードでエラーが発生しなくなり、UIでのレスポンスが向上します。

興味があればthis is a CP article of the toolです。

+1

私はそれについて考えました。しかし、私はこれが大きなバグを引き起こすかもしれないとも考えました:) – 2xMax

+0

はい、丸いものにするにはかなりの時間がかかりました。 –

9

確かGB 2-10することができ。

-

UPDATE:

私は大きなファイルを扱うについては、今、あなたの更新を参照してください。 WCFに組み込まれているMTOM protocol with streamingは、このようなシナリオを処理するために最適化されています。

+0

バッファー???私は内容を意味すると思います... – scartag

+0

大きなファイルはどうですか? – 2xMax

+0

@scartag、そう、それは私が意味していた。 –

0

非常に大きなファイルの場合、Webサービスに送信する唯一の効率的な方法はMTOMです。 MTOMはsupported in WCFで、あなたが除外しています。古いスタイルの.asmx Webサービスでこれを行う唯一の方法は、@Darin Dimitrovが与えた答えです。そして、その解決策では、ファイルのbase64エンコード(33%以上の帯域幅)のコストがかかります。

0

基本的にHTTP POSTを使用してクライアント側の標準FileUploadコントロールを使用してファイルをアップロードするのと同じ要件がありました。 最後に、ASPXページをASMX Webサービスプロジェクトに追加しました。これにより、Webサービスがhttp://foo/bar/baz.asmxにあるときにhttp://foo/bar/Upload.aspxにアップロードすることができました。これにより、別のWebページを使用していたとしても、Webサービス内の機能が維持されました。

これはあなたの要件に合っているかもしれないし、そうでないかもしれませんが、@ダリンズのアプローチは回避策としても機能しますが、私たちの選択肢ではなかったクライアント側で修正する必要があります。

関連する問題