>  기사  >  웹 프론트엔드  >  파일을 업로드하여 반환된 json 데이터는 문제solution_javascript 기술을 다운로드하라는 메시지가 표시됩니다.

파일을 업로드하여 반환된 json 데이터는 문제solution_javascript 기술을 다운로드하라는 메시지가 표시됩니다.

WBOY
WBOY원래의
2016-05-16 16:29:281411검색

최근 프로젝트에서는 파일 업로드로 반환된 json 데이터를 다운로드하라는 메시지가 표시됩니다. IE10에서만 발생합니다. 프런트 엔드는 jQuery 플러그인 ajaxForm을 사용하여 양식을 제출하고 백그라운드에서 반환되는 데이터 형식은 json입니다. 코드는 다음과 같습니다.

백엔드 Python:

코드 복사 코드는 다음과 같습니다.

def jsonp(func):
"""JSONP 요청에 대한 JSON화된 출력을 래핑합니다."""
@wraps(func)
def Decorated_function(*args, **kwargs):
​​​​ 콜백 = request.args.get('callback', False)
temp_content = func(*args, **kwargs)
           if isinstance(temp_content, dict):
              temp_content.setdefault('success', True)
               temp_content.setdefault('code', 200)
             시도해 보세요:
                 temp_content = json.dumps(temp_content, indent=4)
              UnicodeDecodeError 제외:
                  시도해 보세요:
                   temp_content = ujson.dumps(temp_content)
                  e:
와 같은 StandardError 제외 로거.예외(e)
                  temp_content = json.dumps({'success': False, 'code': 500, 'info': 'INVALID_CONTENT'})
             temp_content = cgi.escape(temp_content)
              콜백인 경우:
                   # http://evilcos.me/?p=425에 따라 jsonp는 /**/머리가 더 안전해질 거예요
내용 = '/**/' str(callback) '(' temp_content ')'
를 추가합니다.                 mimetype = 'application/javascript'
헤더 = {'charset':'utf-8'}
                  return current_app.response_class(content, mimetype=mimetype, headers=headers)
             그 외:
                 mimetype = 'application/json'
헤더 = {'charset':'utf-8'}
내용 = 임시_내용
                   return current_app.response_class(content, mimetype=mimetype, headers=headers)
​​​​ elif isinstance(temp_content, basestring):
             temp_content = cgi.escape(temp_content)
               temp_content 반환
        그 외:
               temp_content 반환
decorated_function 반환
@mod.route('/patch/install.json',method=['POST'])
@jsonp
def patch_install():
{'데이터': '데이터'}를 반환합니다

프런트엔드 js 코드:

코드 복사 코드는 다음과 같습니다.

$('#form').ajaxSubmit({
URL : '/patch/install.json',
유형 : '게시물',
데이터 유형: 'json',
iframe : 사실,
성공: 함수(res) {
             // 코드
}
});

해결책:
백엔드에서 반환하는 데이터 형식을 다음과 같이 text/html 형식으로 변경해야 합니다.

코드 복사 코드는 다음과 같습니다.

def 일반(func):
"""텍스트/html 응답 줄 바꿈"""
@wraps(func)
def _inner(*args, **kwargs):
          resp = func(*args, **kwargs)
          isinstance(resp, dict)인 경우:
               resp.setdefault('success', True)
                resp.setdefault('code', 200)
               resp = json.dumps(resp)
              resp = cgi.escape(resp)
                return current_app.response_class(resp, mimetype='text/html', headers={'charset': 'utf-8'})
         elif isinstance(resp, basestring):
               resp = cgi.escape(resp)
                return current_app.response_class(resp, mimetype='text/html', headers={'charset': 'utf-8'})
        그 외:
              답장
_내부 복귀
@mod.route('/patch/install.json',method=['POST'])
@플레인
def patch_install():
{'데이터': '데이터'}를 반환합니다

참고: 이 예시의 백엔드는 Python을 사용합니다. 프로젝트에서 동일한 문제가 발생하면 해당 언어로 변경하세요

실제로 이 문제를 해결하려면 "백엔드에서 반환되는 데이터 형식을 text/html 형식으로 변경하세요"라는 한 문장으로 간단히 정리하면 됩니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.