none
ファイルをアップロードするとサイズが0になる原因 RRS feed

  • 質問


  • 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);
    
                }

    2014年9月4日 21:54

回答

  • ちょっと気になりましたけど、これ複数ファイルの時ファイル名が同じになったりしないですか?

    • 回答の候補に設定 星 睦美 2014年9月30日 1:49
    • 回答としてマーク 星 睦美 2014年10月6日 8:18
    2014年9月5日 0:47
  • JavaScript側、upload_blobは適切ですか? 非同期でまだ値が入っていないとかそういうことはありませんか?
    # 試しに固定文字列などにしたら書き込み成功したりして。
    • 回答としてマーク 星 睦美 2014年10月6日 8:18
    2014年9月5日 1:57

すべての返信

  • ファイルは作成されているけれどもサイズがゼロということでしょうか?

    とりあえずファイルをz保存する箇所で、file.ContentLength辺りの情報を含めてログ出力しておいて、まず正常にファイルが受信できているか確認してみるのはどうでしょうか?

    あと、この件とは関係ないですけどクライアントからのパスやファイル名をそのまま使うのは大抵かなり危険です。

    Webアプリケーション配下のフォルダ内に書き込み可能なフォルダがあれば、自由にファイルを書き込んだりできる可能性がありますので注意した方がいいです。

    ※読み込みだと(アカウントに権限があることが多いため)もっと危険ですが、書き込みも権限があれば破壊的な操作ができる可能性があるため結構危険です。

    ※MapPathはWebアプリの外には出られないはずですが、親ディレクトリの相対指定はできるかもしれません(未確認)。

    2014年9月5日 0:30
  • > 全てではないのですが、ごくたまにアップロードされた画像データがゼロになってしまいます。

    第三者には再現できない問題のようですので、その原因追求は質問者さん以外ではできないと思うのですが。

    今のある情報だけですと、その時に接続が切れたぐらいしか原因は想像できません。

    何処で問題が発生しているかぐらいの切り分けはできないのでしょうか?

    【追伸】

    質問される際には、最初に環境(OS, IIS, ASP.NET のバージョンなど)を書いてください。質問と関係ないと思われるかもしれませんが、例えば、アップロードされたファイルが HDD にバッファリングされる際のファイルサイズの閾値が ASP.NET のバージョンによって異なるというようなこともあります。


    • 編集済み SurferOnWww 2014年9月5日 0:55 追伸の誤字訂正
    2014年9月5日 0:40
  • ちょっと気になりましたけど、これ複数ファイルの時ファイル名が同じになったりしないですか?

    • 回答の候補に設定 星 睦美 2014年9月30日 1:49
    • 回答としてマーク 星 睦美 2014年10月6日 8:18
    2014年9月5日 0:47
  • ファイルがサイズ0で作成されており、ファイル名などは問題く付与されているのです。

    file.ContentLength辺りの情報を含めてログ出力して確認してみます。

    ありがとうございます。

    2014年9月5日 0:56
  • ありがとうございます。

    もし、同じような経験をしたかがおられたらと思い投稿させて頂きました。

    ログ出力して、確認してみます。

    2014年9月5日 0:58
  • 一応、multipleは指定していないのと、スマホからなので、

    複数選択はできず安心していました。

    context.Request.Files.Count自体が必要ないのですが

    念のためミリ秒まで取得することで重複しないかと考えたいたのですが、

    もしかすると、何か複数で取得されてしまい、2個めのファイルがサイズ0で保存されている可能性もありますね。

    この当たりも含めて確認してみます。ありがとうございます

    2014年9月5日 1:05
  • 開発環境の記述をいつも失念してしまいます。

    申し訳ありません。利用しているバージョンは下記の通りです。

    Windows8 Pro、VisualStudio2012

    ASP.NET (c#)、Framework4、IIS 8.0

    バッファリングされる際のファイルサイズの閾値がバージョンによって違うなど有益な情報ありがとうございます

    こちらも意識しながら確認してみます。。ありがとうございます。


    2014年9月5日 1:37
  • > バッファリングされる際のファイルサイズの閾値がバージョンによって違うなど
    > 有益な情報ありがとうございます

    デフォルト値はフォームやアップロードされたファイルすべてを含めて .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

    今回の問題と関係あるのかどうか分かりませんが、ご参考まで。

    2014年9月5日 1:49
  • JavaScript側、upload_blobは適切ですか? 非同期でまだ値が入っていないとかそういうことはありませんか?
    # 試しに固定文字列などにしたら書き込み成功したりして。
    • 回答としてマーク 星 睦美 2014年10月6日 8:18
    2014年9月5日 1:57
  • フォーラム オペレーターの星 睦美です。
    hys73 さん、こんにちは。

    今回の質問の事象は解決できましたでしょうか?

    よろしければ解決した方法をお知らせいただけると、コミュニティのユーザーと技術的な情報を共有することができるのではないかと思います。※参考になったユーザーからの返信には投稿者から[回答としてマーク] をお願いします。

    ---
    今回は同様の事象に関する情報をお探しの方にトラブルシューティングのポイントとして参考になりそうな返信に、私のほうで[回答としてマーク] させていただきました。
    これからもMSDN フォーラムをよろしくお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support


    • 編集済み 星 睦美 2014年10月6日 8:20 回答としてマーク
    2014年9月30日 1:57