2017-06-23 9 views
0

jquery filedropを使用していて、Internet Explorer(10+)でreadAsBinaryStringを使用してエラーが発生しました。 ChromeとFirefoxで動作します。HttpPostedFileBaseから受け取ったbase64ファイルを保存します

次に、この方法をすべてのブラウザで「機能する」readAsDataURLに変更しました。

この最後のメソッドはHttpPostedFileBaseからbase64ファイルを返し、そのままファイルを保存する方法がわかりません。今、私のコードザッツ

byte[] binaryData; 
binaryData = new Byte[file.InputStream.Length]; 
long bytesRead = file.InputStream.Read(binaryData, 0, (int)file.InputStream.Length); 
file.InputStream.Close(); 
string base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length); 

byte[] bytes = System.Convert.FromBase64String(base64String); 

string filePath = Path.Combine(ed_fisico_provisorio.vr_parametro, no_arquivo_provisorio); 

System.IO.FileStream fs = System.IO.File.Create(filePath); 
fs.Write(bytes, 0, bytes.Length); 
fs.Close(); 

しかし、このように保存し、ファイルの内容は、データ

のようになります。アプリケーション/ mswordは、base64,0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7 ...

他のアイデアはありますか?

----- UPDATE -----

を明確にするために、何が起こっているかをステップバイステップ。ところで、私はC#MVCを使用しています。

ステップ1 - プラグインjquery.filedrop.jsを使用して、ファイルをビューにドロップします。任意のファイル拡張子にすることができます。

STEP 2 - このコードが含まれてプラグインを呼び出します:

// Respond to an upload 
     function upload() { 

      stop_loop = false; 

      if (!files) { 
       opts.error(errors[0]); 
       return false; 
      } 

      var filesDone = 0, 
       filesRejected = 0; 

      if (files_count > opts.maxfiles && opts.queuefiles === 0) { 
       opts.error(errors[1]); 
       return false; 
      } 

      // Define queues to manage upload process 
      var workQueue = []; 
      var processingQueue = []; 
      var doneQueue = []; 

      // Add everything to the workQueue 
      for (var i = 0; i < files_count; i++) { 
       workQueue.push(i); 
      } 

      // Helper function to enable pause of processing to wait 
      // for in process queue to complete 
      var pause = function (timeout) { 
       setTimeout(process, timeout); 
       return; 
      } 

      // Process an upload, recursive 
      var process = function() { 

       var fileIndex; 

       if (stop_loop) return false; 

       // Check to see if are in queue mode 
       if (opts.queuefiles > 0 && processingQueue.length >= opts.queuefiles) { 

        return pause(opts.queuewait); 

       } else { 

        // Take first thing off work queue 
        fileIndex = workQueue[0]; 
        workQueue.splice(0, 1); 

        // Add to processing queue 
        processingQueue.push(fileIndex); 

       } 

       try { 
        if (beforeEach(files[fileIndex]) != false) { 
         if (fileIndex === files_count) return; 
         var reader = new FileReader(), 
          max_file_size = 1048576 * opts.maxfilesize; 

         reader.index = fileIndex; 
         if (files[fileIndex].size > max_file_size) { 
          opts.error(errors[2], files[fileIndex], fileIndex); 
          // Remove from queue 
          processingQueue.forEach(function (value, key) { 
           if (value === fileIndex) processingQueue.splice(key, 1); 
          }); 
          filesRejected++; 
          return true; 
         } 
         reader.onloadend = send; 





         //reader.readAsArrayBuffer(files[fileIndex]); 


         reader.readAsDataURL(files[fileIndex]); 



         //reader.readAsBinaryString(files[fileIndex]); 

        } else { 
         filesRejected++; 
        } 
       } catch (err) { 
        // Remove from queue 
        processingQueue.forEach(function (value, key) { 
         if (value === fileIndex) processingQueue.splice(key, 1); 
        }); 
        opts.error(errors[0]); 
        return false; 
       } 

       // If we still have work to do, 
       if (workQueue.length > 0) { 
        process(); 
       } 

      }; 

      var send = function (e) { 

       var fileIndex = ((typeof (e.srcElement) === "undefined") ? e.target : e.srcElement).index 

       // Sometimes the index is not attached to the 
       // event object. Find it by size. Hack for sure. 
       if (e.target.index == undefined) { 
        e.target.index = getIndexBySize(e.total); 
       } 

       var xhr = new XMLHttpRequest(), 
        upload = xhr.upload, 
        file = files[e.target.index], 
        index = e.target.index, 
        start_time = new Date().getTime(), 
        boundary = '------multipartformboundary' + (new Date).getTime(), 
        builder; 

       newName = rename(file.name); 
       mime = file.type 
       if (typeof newName === "string") { 
        builder = getBuilder(newName, e.target.result, mime, boundary); 
       } else { 
        builder = getBuilder(file.name, e.target.result, mime, boundary); 
       } 

       upload.index = index; 
       upload.file = file; 
       upload.downloadStartTime = start_time; 
       upload.currentStart = start_time; 
       upload.currentProgress = 0; 
       upload.startData = 0; 
       upload.addEventListener("progress", progress, false); 


       xhr.open("POST", opts.url, true); 
       xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' + boundary); 

       // Add headers 
       $.each(opts.headers, function (k, v) { 
        xhr.setRequestHeader(k, v); 
       }); 

       xhr.sendAsBinary(builder); 

       opts.uploadStarted(index, file, files_count); 

       xhr.onload = function() { 
        if (xhr.responseText) { 
         var now = new Date().getTime(), 
          timeDiff = now - start_time, 
          result = opts.uploadFinished(index, file, jQuery.parseJSON(xhr.responseText), timeDiff, xhr); 
         filesDone++; 

         // Remove from processing queue 
         processingQueue.forEach(function (value, key) { 
          if (value === fileIndex) processingQueue.splice(key, 1); 
         }); 

         // Add to donequeue 
         doneQueue.push(fileIndex); 

         if (filesDone == files_count - filesRejected) { 
          afterAll(); 
         } 
         if (result === false) stop_loop = true; 
        } 
       }; 

      } 

      // Initiate the processing loop 
      process(); 

     } 

STEP 3 - 私はファイルを受信し、それを保存しようとするコントローラーへのプラグインのリターン:

[HttpPost] 
public ActionResult UploadFiles(IEnumerable<HttpPostedFileBase> files) 
      {     
        byte[] binaryData; 
        binaryData = new Byte[file.InputStream.Length]; 
        long bytesRead = file.InputStream.Read(binaryData, 0, (int)file.InputStream.Length); 
        file.InputStream.Close(); 
        string base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length); 

        byte[] bytes = System.Convert.FromBase64String(base64String); 

        //Salva arquivo físico em pasta provisória 
        string filePath = Path.Combine(ed_fisico_provisorio.vr_parametro, file.FileName); 

        System.IO.FileStream fs = System.IO.File.Create(filePath); 

        fs.Write(bytes, 0, bytes.Length); 
        fs.Close(); 
    } 

保存されたファイルの内容は上記のとおりです。

ご協力いただければ幸いです。

答えて

1

ファイル(WEBAPI、MVC、Something Awesome)を受け取るためにどのような技術を使用しているのかはっきりしませんが、これをWebAPI 2エンドポイントで過去に使用し、ストリームを使用してファイルデータを処理しました。ファイルの内容がテキストである場合は、その後fileStream.ReadAsStreamAsync()またはfileStream.ReadAsStringAsync()を使用することができますfileStreamオブジェクトと

public async Task<IHttpActionResult> Post() 
    { 
     var provider = new MultipartMemoryStreamProvider(); 
     var stream = await Request.Content.ReadAsMultipartAsync(provider).ConfigureAwait(false); 

     // Returns the first file it finds 
     var fileStream = stream.Contents.FirstOrDefault(x => x.Headers.ContentDisposition.FileName != null); 

     // return a result 
    } 

+0

アロン、答えてくれてありがとうが、私はあなたがしたことをよく理解していませんでした。だから私は明確にするために自分の投稿を編集する。 – Lucas

関連する問題