将流写入文件 - 文件已损坏.xls、.doc

问题描述

我正在使用块上传上传包含多个文件文件夹。

$("#folders").kendoUpload({
                    async: {
                        saveUrl: baseAddrs + "/" + "DragAndDrop/ChunkSave",removeUrl: baseAddrs + "/" + "DragAndDrop/remove",chunkSize: 31457280,// ~30 MB
                        autoUpload: true,concurrent: true
                    },upload: onUpload,directory: true,directoryDrop: true,complete: onComplete,success: onFileSuccess,error: onError
                });

我正在使用 AppendtoFile 逻辑,以防文件大于 30 MB,它将拆分和上传。 示例-> 如果上传 50 MB 的文件,它将分成 2 个块,前 30 MB 的数据将写入文件,并在下一次迭代中写入 20 MB。我首先将此文件写入临时位置,第一次运行的文件大小将为 30 MB,对于最后一个块,它会将接下来的 20 MB 附加到文件中,现在该文件将变为 50 MB。现在,当我尝试从临时位置打开此文件时,它说文件已损坏或没有有效的扩展名。扩展名有效,我已验证。 .xls,.docx,.pptx,.jpg 这个文件给出了同样的错误信息,但 .pdf 就像一个魅力,没有任何问题。即使文件大小低于 30 MB,以上扩展名也不起作用,只有 .pdf 有效。我错过了什么?

 public string AppendChunkData(string filePath,ChunkMetaData MetaData)
        {
            var uniqueUploadId = MetaData.UploadUid;            
            string BaseFileName = Path.GetFileName(filePath);
            string path = Server.MapPath(UploadTemp + "/ChunkUpload");
            string newpath =  Path.Combine(path,uniqueUploadId + BaseFileName);
            byte[] byteArray = StreamToByteArray(Request.InputStream);

            using (var stream = new FileStream(newpath,FileMode.Append))
            {
                stream.Write(byteArray,byteArray.Length);
            }
            
            return newpath;
        }

 private byte[] StreamToByteArray(Stream srcFile)
        {
            srcFile.Position = 0;//faster than seek when dealing with an absolute position.
            byte[] buffer = new byte[srcFile.Length];
            srcFile.Read(buffer,buffer.Length);
            return buffer;
        }

解决方法

我找到了问题所在,问题出在 Request.InputStream 上。我没有通过正确的流。在我通过正确的流之后。它适用于各种文件。