2010-12-06 13 views
1

私はバリュームのアップロード[github link]の少し修正したバージョンを使用していますInputStreamとして要求にファイルを取得するために使用しているjavascriptを変更していません。バールファイルのアップロード - Chromeでは動作しますが、IEでは使用できません。画像img = Image.FromStream(Request.InputStream)

IE 8では次のコード行が失敗していますが、Chromeで動作することが確認されています。

using (Image imgInput = Image.FromStream(Request.InputStream)) 

エラーは「パラメータが無効です」です。使用されている入力ストリームに問題があるようですが、データは存在しています(データが良好かどうかを検証する方法がわかりません)。

誰もがアイデアを持っているか、もっと詳しく説明できますか?同じ画像をChromeで使用でき、適切にアップロードされます。

ページ

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Upload-Pictures</h2> 
    <div id="file-uploader"> 
     <noscript> 
      <p>Please enable JavaScript to use file uploader.</p> 
     </noscript> 
    </div> 
    <script src="/Scripts/fileuploader.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     function createUploader() { 
      var uploader = new qq.FileUploader({ 
       element: document.getElementById('file-uploader'), 
       action: '/Admin/FileUpload/' + <%= Model.PropertyId %>, 
       debug: true 
      }); 
     } 
     window.onload = createUploader; 
    </script> 
</asp:Content> 

コントローラ

[AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult FileUpload(int id) 
    { 
     try 
     { 
      byte[] newImageByteArray = GetByteArrayForResizedImage(350, Request.InputStream); 
      byte[] thumbnailByteArray = GetByteArrayForResizedImage(150, Request.InputStream); 

      //Add to DB 
     } 
     catch (Exception ex) 
     { 
      // This is where the exception is caught 
      return Json(new { success = false, message = ex.Message }, "application/json"); 
     } 

     return Json(new { success = true }, "application/json"); 
    } 

    private static byte[] GetByteArrayForResizedImage(int imageSize, Stream inputStream) 
    { 
     byte[] imageByteArray; 

     // For some reason in IE the inputStream here is causing it to crash 
     using (Image imgInput = Image.FromStream(inputStream)) 
     { 
      //Image processing 
     } 

     return imageByteArray; 
    } 

fileuploader.js - qq.FileUploader

/** 
* Class that creates upload widget with drag-and-drop and file list 
* @inherits qq.FileUploaderBasic 
*/ 
qq.FileUploader = function(o){ 
    // call parent constructor 
    qq.FileUploaderBasic.apply(this, arguments); 

    // additional options  
    qq.extend(this._options, { 
     element: null, 
     // if set, will be used instead of qq-upload-list in template 
     listElement: null, 

     template: '<div class="qq-uploader">' + 
       '<div class="qq-upload-drop-area"><span>Drop files here to upload</span></div>' + 
       '<div class="qq-upload-button">Upload a file</div>' + 
       '<ul class="qq-upload-list"></ul>' + 
      '</div>', 

     // template for one item in file list 
     fileTemplate: '<li>' + 
       '<span class="qq-upload-file"></span>' + 
      '<span class="qq-upload-spinner"></span>' + 
      '<span class="qq-upload-size"></span>' + 
      '<a class="qq-upload-cancel" href="#">Cancel</a>' + 
      '<span class="qq-upload-failed-text">Failed</span>' + 
     '</li>',   

     classes: { 
      // used to get elements from templates 
      button: 'qq-upload-button', 
      drop: 'qq-upload-drop-area', 
      dropActive: 'qq-upload-drop-area-active', 
      list: 'qq-upload-list', 

      file: 'qq-upload-file', 
      spinner: 'qq-upload-spinner', 
      size: 'qq-upload-size', 
      cancel: 'qq-upload-cancel', 

      // added to list item when upload completes 
      // used in css to hide progress spinner 
      success: 'qq-upload-success', 
      fail: 'qq-upload-fail' 
     } 
    }); 
    // overwrite options with user supplied  
    qq.extend(this._options, o);  

    this._element = this._options.element; 
    this._element.innerHTML = this._options.template;   
    this._listElement = this._options.listElement || this._find(this._element, 'list'); 

    this._classes = this._options.classes; 

    this._button = this._createUploadButton(this._find(this._element, 'button'));   

    this._bindCancelEvent(); 
    this._setupDragDrop(); 
}; 

fileuploader.js - qq.FileUploaderBasic

/** 
* Creates upload button, validates upload, but doesn't create file list or dd. 
*/ 
qq.FileUploaderBasic = function(o){ 
    this._options = { 
     // set to true to see the server response 
     debug: false, 
     action: '/server/upload', 
     params: {}, 
     button: null, 
     multiple: true, 
     maxConnections: 3, 
     // validation   
     allowedExtensions: [],    
     sizeLimit: 0, 
     minSizeLimit: 0,        
     // events 
     // return false to cancel submit 
     onSubmit: function(id, fileName){}, 
     onProgress: function(id, fileName, loaded, total){}, 
     onComplete: function(id, fileName, responseJSON){}, 
     onCancel: function(id, fileName){}, 
     // messages     
     messages: { 
      typeError: "{file} has invalid extension. Only {extensions} are allowed.", 
      sizeError: "{file} is too large, maximum file size is {sizeLimit}.", 
      minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.", 
      emptyError: "{file} is empty, please select files again without it.", 
      onLeave: "The files are being uploaded, if you leave now the upload will be cancelled."    
     }, 
     showMessage: function(message){ 
      alert(message); 
     }    
    }; 
    qq.extend(this._options, o); 

    // number of files being uploaded 
    this._filesInProgress = 0; 
    this._handler = this._createUploadHandler(); 

    if (this._options.button){ 
     this._button = this._createUploadButton(this._options.button); 
    } 

    this._preventLeaveInProgress();   
}; 
+1

私が提供した情報から、合理的な回答が可能であることは間違いありません。ホープは決して死ぬことはない。 –

+0

応答を期待するのに合理的にするために他に何が含まれているかについての提案が大好きです。 – mwright

答えて

3

IEをブラウザとして使用しているときに、リクエストに入力ストリームがないことが分かります。ファイル配列から次のようにコードを抜き出してコードを修正して終了しました。

if (String.IsNullOrEmpty(Request["qqfile"])) 
{ 
    //This works with IE 
    HttpPostedFileBase httpPostedFileBase = Request.Files[0] as HttpPostedFileBase; 
    byte[] newImageByteArray = GetByteArrayForResizedImage(350, httpPostedFileBase.InputStream); 
    byte[] thumbnailByteArray = GetByteArrayForResizedImage(150, httpPostedFileBase.InputStream); 

    //Do stuff here 

    return Json(new { success = true }, "text/html"); 
} 
else 
{ 
    byte[] newImageByteArray = GetByteArrayForResizedImage(350, Request.InputStream); 
    byte[] thumbnailByteArray = GetByteArrayForResizedImage(150, Request.InputStream); 

    //Do stuff here 

    return Json(new { success = true }, "application/json"); 
} 
+1

私は同じ問題があります。 http://stackoverflow.com/questions/4884920/mvc3-valums-ajax-file-uploadこちらをご覧ください。 – ShaneKm

関連する問題