トップ回答者
ファイルをアップロードするとサイズが0になる原因

質問
-
IPHONE、アンドロイドからローカルファイルをアップロードするWEBアプリを作っています。
全てではないのですが、ごくたまにアップロードされた画像データがゼロになってしまいます。
(連続する時もあります)
サーバの容量は余裕があり、数Kの画像でもゼロになる場合があるようです。
アップロードはjavascriptから呼んでいますが、原因が分からない為、質問させて頂きました。
何かご存知の方がおられましたら。教えて下さい
---ASP.NET---
<%@ WebHandler Language="C#" Class="FileUploadHandler" %> using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Configuration; using MySql.Data.MySqlClient; using System.Diagnostics; using System.Web.Http; using System.IO; public class FileUploadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.Request.Form["dir"] != "") { if (context.Request.Files.Count > 0) { HttpFileCollection files = context.Request.Files; for (int i = 0; i < files.Count; i++) { HttpPostedFile file = files[i]; // 現在の日付と時刻を取得する DateTime dtNow = DateTime.Now; string fname = dtNow.ToString("yyMMdd_HHmmss_fff") + "_" + context.Request.Form["comment"] + ".jpg"; string fnamepath = context.Server.MapPath("uploads/" + context.Request.Form["dir"] + "/" + fname ); file.SaveAs(fnamepath); } } context.Response.ContentType = "text/plain"; context.Response.Write("File(s) Uploaded Successfully!"); } } public bool IsReusable { get { return false; } } }
--Javascript--
//アップロード function upload() { var data = new FormData(); $("#pic").unbind(animationEndEvt, upload); var fileUpload = $("#FileUpload1").get(0); var files = fileUpload.files; for (var i = 0; i < files.length; i++) { data.append('photo', upload_blob, files[i].name); } data.append('dir', params['dir']); data.append('comment', $("#comment").val()); var options = {}; options.url = "FileUploadHandler.ashx"; options.type = "POST"; options.data = data; options.contentType = false; options.processData = false; options.success = function (result) { alert('送信完了!'); window.location.reload(); }; options.error = function (err) { alert('送信エラー 少し間を明けて送信してください'); window.location.reload(); //ページをリロード }; event.preventDefault(); $.ajax(options); }
回答
すべての返信
-
ファイルは作成されているけれどもサイズがゼロということでしょうか?
とりあえずファイルをz保存する箇所で、file.ContentLength辺りの情報を含めてログ出力しておいて、まず正常にファイルが受信できているか確認してみるのはどうでしょうか?
あと、この件とは関係ないですけどクライアントからのパスやファイル名をそのまま使うのは大抵かなり危険です。
Webアプリケーション配下のフォルダ内に書き込み可能なフォルダがあれば、自由にファイルを書き込んだりできる可能性がありますので注意した方がいいです。
※読み込みだと(アカウントに権限があることが多いため)もっと危険ですが、書き込みも権限があれば破壊的な操作ができる可能性があるため結構危険です。
※MapPathはWebアプリの外には出られないはずですが、親ディレクトリの相対指定はできるかもしれません(未確認)。
-
> 全てではないのですが、ごくたまにアップロードされた画像データがゼロになってしまいます。
第三者には再現できない問題のようですので、その原因追求は質問者さん以外ではできないと思うのですが。
今のある情報だけですと、その時に接続が切れたぐらいしか原因は想像できません。
何処で問題が発生しているかぐらいの切り分けはできないのでしょうか?
【追伸】
質問される際には、最初に環境(OS, IIS, ASP.NET のバージョンなど)を書いてください。質問と関係ないと思われるかもしれませんが、例えば、アップロードされたファイルが HDD にバッファリングされる際のファイルサイズの閾値が ASP.NET のバージョンによって異なるというようなこともあります。
- 編集済み SurferOnWww 2014年9月5日 0:55 追伸の誤字訂正
-
> バッファリングされる際のファイルサイズの閾値がバージョンによって違うなど
> 有益な情報ありがとうございますデフォルト値はフォームやアップロードされたファイルすべてを含めて .NET 3.5, 4 の場合 80KB、.NET 2.0, 3.0 の場合は 256 バイトです。詳しくは以下のページを見てください。
アップロードされたファイルの一時保存先
http://surferonwww.info/BlogEngine/post/2011/08/01/Temporary-store-of-uploaded-file.aspx今回の問題と関係あるのかどうか分かりませんが、ご参考まで。
-
フォーラム オペレーターの星 睦美です。
hys73 さん、こんにちは。今回の質問の事象は解決できましたでしょうか?
よろしければ解決した方法をお知らせいただけると、コミュニティのユーザーと技術的な情報を共有することができるのではないかと思います。※参考になったユーザーからの返信には投稿者から[回答としてマーク] をお願いします。
---
今回は同様の事象に関する情報をお探しの方にトラブルシューティングのポイントとして参考になりそうな返信に、私のほうで[回答としてマーク] させていただきました。
これからもMSDN フォーラムをよろしくお願いします。
フォーラム オペレーター 星 睦美 - MSDN Community Support
- 編集済み 星 睦美 2014年10月6日 8:20 回答としてマーク