我試圖設置Valums文件上傳器(https://github.com/valums/file-uploader),在VB中使用ASP.NET。該文件目前正在上傳並存儲到我想要的位置,並且似乎可以正常工作,但似乎Firefox和Chrome(我假設使用Safari)會在正在上傳的實際CSV文件中追加一些附加文本。Valums上傳器額外的請求有效負載添加到文件
例如,這是我在通過Firefox中上傳文件中看到:
-----------------------------31203180683076
Content-Disposition: form-data; name="qqfile"; filename="test.csv"
Content-Type: application/vnd.ms-excel
/* ACTUAL CONTENTS OF FILE HERE */
-----------------------------31203180683076--
同樣,鉻:
------WebKitFormBoundarytB00bSQcafSOAnmq
Content-Disposition: form-data; name="qqfile"; filename="test.csv"
Content-Type: application/vnd.ms-excel
/* ACTUAL CONTENTS OF FILE HERE */
------WebKitFormBoundarytB00bSQcafSOAnmq--
如果我在Chrome瀏覽網絡面板我清楚地看到上面發佈的內容是在請求有效內容中發送的,但是我想要刪除它,或者在寫入文件時在服務器上完全忽略它。當我向上傳者添加paramsInBody: false
時,我以爲自己找到了解決方案,它確實消除了一些混亂,但並非全部。
下面是在客戶端的相關代碼:
function createUploader() {
var uploader = new qq.FineUploader({
element: document.getElementById('bootstrapped-fine-uploader'),
request: {
paramsInBody: false,
endpoint: 'Uploader.ashx'
},
validation: {
allowedExtensions: ['csv', 'txt']
},
text: {
uploadButton: '<div><i class="icon-upload-alt icon-white"></i> Browse for files...</div>'
},
template: '<div class="span12"><div class="qq-uploader">' +
'<pre class="qq-upload-drop-area span12"><span>{dragZoneText}</span></pre>' +
'<div class="qq-upload-button btn btn-success" style="width: auto;">{uploadButtonText}</div>' +
'<span class="qq-drop-processing"><span class="qq-drop-processing-spinner"></span></span>' +
'<ul class="qq-upload-list" style="margin: 0; list-style-type: none; margin-top: 20px;"></ul>' +
'</div></div>',
classes: {
success: 'alert alert-success',
fail: 'alert alert-error'
}
});
}
而且這裏是有關服務器端處理程序:
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
On Error GoTo upload_error
Dim Request = context.Request
Dim strm As Stream = Request.InputStream
Dim br As BinaryReader = New BinaryReader(strm)
Dim fileContents() As Byte = {}
Const ChunkSize As Integer = 1024 * 1024
' We need to hand IE a little bit differently...
If Request.Browser.Browser = "IE" Then
Dim myfiles As System.Web.HttpFileCollection = System.Web.HttpContext.Current.Request.Files
Dim postedFile As System.Web.HttpPostedFile = myfiles(0)
If Not postedFile.FileName.Equals("") Then
Dim fn As String = System.IO.Path.GetFileName(postedFile.FileName)
br = New BinaryReader(postedFile.InputStream)
End If
End If
' Now have the binary reader on the IE file input Stream. Back to normal...
Do While br.BaseStream.Position < br.BaseStream.Length - 1
Dim b(ChunkSize - 1) As Byte
Dim ReadLen As Integer = br.Read(b, 0, ChunkSize)
Dim dummy() As Byte = fileContents.Concat(b).ToArray()
fileContents = dummy
dummy = Nothing
Loop
' Or write it to the filesystem:
Dim writeStream As FileStream = New FileStream("C:\TEMP\" & System.Guid.NewGuid.ToString() & ".csv", FileMode.Create)
Dim bw As New BinaryWriter(writeStream)
bw.Write(fileContents)
bw.Close()
' it all worked ok so send back SUCCESS is true!
context.Response.Write("{""success"":true}")
Exit Sub
upload_error:
context.Response.Write("{""error"":""An Error Occured""}")
End Sub
爲什麼它會以這種方式工作任何想法?非常感謝。