上传文本文件时,XHR Chunk上传有一个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上传文本文件时,XHR Chunk上传有一个问题相关的知识,希望对你有一定的参考价值。

我在ColdFusion项目中使用XHR块上传。除了扩展名为.txt的文件外,上传工作正常。当我尝试上传文本文件时,它将被上传并变为空(文件大小变为0字节)。

为什么会这样?

这是我得到的例外......

An exception occurred when executing method write.The cause of this exception was that: coldfusion.runtime.Cast$NumberConversionException: The value Hello this is a test file. cannot be converted to a number..

这是我的home.cfm

<html>
	<head>
		<title>Chunk Upload</title>
		<style type="text/css">
			.text-center{text-align: center;}
			#alert{color: red}
			#uploading, .filesize{color: red}
			#success{color: green}
		</style>
	</head>
	<body>
		<script type="text/javascript">

            var blobs = [];

            function bytesToSize(bytes) {
			   var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
			   if (bytes == 0) return '0 Byte';
			   var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
			   return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
			};
		/*
		 * function that uploads a fragment of the file
		 */
                function uploadChunk(blob, fileName, fileType, count){
                    var xhr = new XMLHttpRequest();
                    xhr.open('POST', 'chunkUpload.cfm', false);
                    xhr.onload = function(e){
                    document.getElementById("success").innerHTML = "Uploading... <span class='filesize'>" + count + "</span> MB";
                    }
                    xhr.setRequestHeader('X_FILE_NAME', fileName);
                    xhr.setRequestHeader('Content-Type', fileType)
                    // document.getElementById("uploading").innerHTML += "Uploading chunk of size " + blob.size + ".<br/>";
                    xhr.send(blob);
                };
		/*
		 * Invoke this function when the submit button is clicked.
		 */
		       function uploadSubmit(){
		 	     var fileInputs = document.querySelectorAll('#userfile');
		 	     for (i = 0; i < fileInputs.length; i++) {
                  sliceFilesToFragments(fileInputs[i]);
                 }
		       };
		/*
		 * function that slice the file into 1MB fragment
		 */
		       function sliceFilesToFragments(input){
		       	    var count = 0;
		       	    var file = input.files[0];
                    // Upload 1 mb per chunk
                    var bytes_per_chunk = 1024 * 1024;
                    var start = 0;
                    var end = bytes_per_chunk;
                    var size = file.size;
                    document.getElementById("TotalSize").innerHTML += "Total File size <span class='filesize'>"+bytesToSize(size)+"</span>";
                    while (start < size) {
			        //push the fragments to an array
                        blobs.push(file.slice(start, end));
                        start = end;
                        end = start + bytes_per_chunk;
                    }
                        var blobArray = blobs.slice();
		            //upload the fragment to the server
                    while (blob = blobs.shift()) {
                    	count++;
                    	if(blobArray.length == count){
                    		count = 'File Uploaded Successfully';
                    	}
			        	uploadChunk(blob, file.name, file.type, count);
                    }
		       };

		</script>
				<h2 class="text-center">Chunk Upload using XHR & CF</h2>
		<form name="myform" method="post" enctype="multipart/form-data" >
			<pre>
				* notes *
				1) Refresh Each time, before upload
				2) Uploading 1 mb per chunk for now
				3) To see the chunks: go to Chrome > inpect element > Network tab
			</pre>
			<pre>
				Upload:<input type="file" id="userfile"><br>
			</pre>
			<pre>
				<input type="button" id="submit" value="Submit" onclick="uploadSubmit()"><br>
			</pre>
			<pre><span id="TotalSize"></span></pre><br>
			<pre><span id="success"></span></pre>
		</form>
	</body>

</html>

这是我的chunkUpload.cfm

 <cfoutput>
	<cfset headerData = getHTTPRequestData().headers>
	<cfset content = getHTTPRequestData().content>
	<cfset filePath = expandPath("./Uploads/") & "#headerData.X_FILE_NAME#">
	<cfset fos = createObject("java", "java.io.FileOutputStream").init(filePath, true)>
	<cfset fos.write(content)>
	<cfset fos.close()>
</cfoutput>

有人可以帮我解决这个问题吗?

答案

我的问题通过更改文件的内容类型得到解决。更新您的内容类型,如下所示

xhr.setRequestHeader('Content-Type', "application/octet-stream");

以上是关于上传文本文件时,XHR Chunk上传有一个问题的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 文件上传不使用 XHR 或 IFrame

XHR 中止不会停止文件上传

在循环中使用 xhr 对象进行 html5 分块上传

上传文件时截断 Web 套接字块

ajax上传文件是怎么实现的

利用FormData对象 + XHR 新特性实现文件上传——带进度条