似乎这个问题已被广泛讨论,但我找不到一般问题的最终解决方案。
长话短说 - 我正在尝试使用嵌入在 HTML 页面中的 Flash SWF 来上传文件。
相关代码非常简单和通用:
_fileRef = new FileReference();
_fileRef.addEventListener(Event.SELECT, onFileSelected);
_fileRef.addEventListener(Event.CANCEL, onFileSelectCancelled);
_fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
_fileRef.addEventListener(ProgressEvent.PROGRESS, progressHandler);
_fileRef.addEventListener(Event.COMPLETE, completeHandler);
_fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadDataComplete);
private function onFileSelectCancelled(e:Event):void {
// handle the case when the user cancels file selection
}
private function onFileSelected(e:Event):void {
// user has selected the file; upload it
var file:FileReference = FileReference(e.target);
file.upload(_uploadURL, "userfile");
}
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " + event);
}
private function progressHandler(event:ProgressEvent):void {
trace("progressHandler: name=" + file.name + " bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}
private function completeHandler(event:Event):void {
trace("completeHandler: " + event);
}
private function uploadDataComplete(event:DataEvent):void {
trace("uploadDataComplete: " + event.data);
}
在我的例子中,Flash SWF 将文件上传到经典 ASP 页面,但它可能是 PHP、ASP.net 或其他东西。
当我使用 http://时,一切都在我测试的所有浏览器中运行良好 - IE、Chrome、Firefox、Safari 等。
我可以看到调用了以下事件/事件处理程序:
- 事件.SELECT
- ProgressEvent.PROGRESS(多次)
- 事件.完成
- DataEvent.UPLOAD_COMPLETE_DATA
但是,当我使用 https://时,该过程在 IE8、IE9、IE10 和 Firefox 中失败,但在 Chrome 和 IE11 中有效。
当它失败时,将调用以下事件/事件处理程序:
- 事件.SELECT
- ProgressEvent.PROGRESS(多次)
- IOErrorEvent.IO_ERROR
IOErrorEvent.IO_ERROR 返回以下错误信息:
"ioErrorHandler: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2038"]"
我相当确定问题与接收文件的 ASP 脚本无关,原因有两个:
- 当我使用http://时,它可以完美运行
- 它似乎在失败时甚至没有被调用/执行。换句话说,如果脚本所做的唯一事情是编写一个简单的日志文件,我仍然会收到错误消息,并且不会写入日志文件。所以,我猜测在执行 ASP 脚本之前触发了 Flash 错误。
我已经看到有关问题与我网站的 SSL 证书有关的建议。
但是,就我而言,证书似乎在各个方面都是有效的——IE 和 Firefox 都没有抱怨它无效。
在 SWF 中,我尝试将file.upload
目标 URL 设置为:
相对网址:
uploader.asp
没有协议的绝对 URL:
www.mydomain.com/uploader.asp
带有协议的绝对 URL:
https://www.mydomain.com/uploader.asp
在最后两种情况下,URL 与 SSL 证书完全匹配,但这并不能解决问题。
那么,底线 - 使用https时是否可以使用简单的 Flash 上传器?
非常感谢您的建议和见解!