working better
							parent
							
								
									8d891f0d51
								
							
						
					
					
						commit
						12c466d2aa
					
				| 
						 | 
				
			
			@ -69,8 +69,7 @@
 | 
			
		|||
<script>
 | 
			
		||||
import {mapState} from 'vuex'
 | 
			
		||||
import Item from './ListingItem'
 | 
			
		||||
import webdav from '@/utils/webdav'
 | 
			
		||||
import page from '@/utils/page'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'listing',
 | 
			
		||||
| 
						 | 
				
			
			@ -138,12 +137,12 @@ export default {
 | 
			
		|||
      let promises = []
 | 
			
		||||
 | 
			
		||||
      for (let file of files) {
 | 
			
		||||
        promises.push(webdav.put(window.location.pathname + base + file.name, file))
 | 
			
		||||
        promises.push(api.put(this.$route.path + base + file.name, file))
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Promise.all(promises)
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          page.reload()
 | 
			
		||||
          // page.reload()
 | 
			
		||||
          // buttons.setDone('upload')
 | 
			
		||||
        })
 | 
			
		||||
        .catch(e => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,8 +28,7 @@
 | 
			
		|||
import { mapMutations, mapGetters, mapState } from 'vuex'
 | 
			
		||||
import filesize from 'filesize'
 | 
			
		||||
import moment from 'moment'
 | 
			
		||||
import webdav from '@/utils/webdav.js'
 | 
			
		||||
import page from '@/utils/page.js'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'item',
 | 
			
		||||
| 
						 | 
				
			
			@ -87,11 +86,13 @@ export default {
 | 
			
		|||
        let url = this.req.items[i].url
 | 
			
		||||
        let name = this.req.items[i].name
 | 
			
		||||
 | 
			
		||||
        promises.push(webdav.move(url, this.url + encodeURIComponent(name)))
 | 
			
		||||
        promises.push(api.move(url, this.url + encodeURIComponent(name)))
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Promise.all(promises)
 | 
			
		||||
        .then(() => page.reload())
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          // page.reload()
 | 
			
		||||
        })
 | 
			
		||||
        .catch(error => console.log(error))
 | 
			
		||||
    },
 | 
			
		||||
    click: function (event) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,15 +6,15 @@
 | 
			
		|||
        <search></search>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div>
 | 
			
		||||
        <rename-button v-show="showRenameButton()"></rename-button>
 | 
			
		||||
        <move-button v-show="showMoveButton()"></move-button>
 | 
			
		||||
        <delete-button v-show="showDeleteButton()"></delete-button>
 | 
			
		||||
        <switch-button v-show="req.kind !== 'editor'"></switch-button>
 | 
			
		||||
        <rename-button v-show="!loading && showRenameButton()"></rename-button>
 | 
			
		||||
        <move-button v-show="!loading && showMoveButton()"></move-button>
 | 
			
		||||
        <delete-button v-show="!loading && showDeleteButton()"></delete-button>
 | 
			
		||||
        <switch-button v-show="!loading && req.kind !== 'editor'"></switch-button>
 | 
			
		||||
        <download-button></download-button>
 | 
			
		||||
        <upload-button v-show="showUpload()"></upload-button>
 | 
			
		||||
        <upload-button v-show="!loading && showUpload()"></upload-button>
 | 
			
		||||
        <info-button></info-button>
 | 
			
		||||
 | 
			
		||||
        <button v-show="req.kind === 'listing'" @click="$store.commit('multiple', true)" aria-label="Select multiple" class="action">
 | 
			
		||||
        <button v-show="isListing" @click="$store.commit('multiple', true)" aria-label="Select multiple" class="action">
 | 
			
		||||
          <i class="material-icons">check_circle</i>
 | 
			
		||||
          <span>Select</span>
 | 
			
		||||
        </button>
 | 
			
		||||
| 
						 | 
				
			
			@ -22,10 +22,10 @@
 | 
			
		|||
    </header>
 | 
			
		||||
 | 
			
		||||
    <nav>
 | 
			
		||||
      <a class="action" :href="baseURL + '/'">
 | 
			
		||||
      <router-link class="action" to="/files/">
 | 
			
		||||
        <i class="material-icons">folder</i>
 | 
			
		||||
        <span>My Files</span>
 | 
			
		||||
      </a>
 | 
			
		||||
      </router-link>
 | 
			
		||||
 | 
			
		||||
      <div v-if="user.allowNew">
 | 
			
		||||
        <button @click="$store.commit('showNewDir', true)" aria-label="New directory" title="New directory" class="action">
 | 
			
		||||
| 
						 | 
				
			
			@ -45,16 +45,16 @@
 | 
			
		|||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <button @click="logout" class="action" id="logout" tabindex="0" role="button" aria-label="Log out">
 | 
			
		||||
      <button @click="logout" class="action" id="logout" aria-label="Log out">
 | 
			
		||||
        <i class="material-icons" title="Logout">exit_to_app</i>
 | 
			
		||||
        <span>Logout</span>
 | 
			
		||||
      </button>
 | 
			
		||||
    </nav>
 | 
			
		||||
 | 
			
		||||
    <main>
 | 
			
		||||
      <editor v-if="req.kind === 'editor'"></editor>
 | 
			
		||||
      <listing v-if="req.kind === 'listing'"></listing>
 | 
			
		||||
      <preview v-if="req.kind === 'preview'"></preview>
 | 
			
		||||
      <editor v-if="isEditor"></editor>
 | 
			
		||||
      <listing v-if="isListing"></listing>
 | 
			
		||||
      <preview v-if="isPreview"></preview>
 | 
			
		||||
    </main>
 | 
			
		||||
 | 
			
		||||
    <download-prompt v-if="showDownload" :class="{ active: showDownload }"></download-prompt>
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@
 | 
			
		|||
    <info-prompt v-if="showInfo" :class="{ active: showInfo }"></info-prompt>
 | 
			
		||||
    <move-prompt v-if="showMove" :class="{ active: showMove }"></move-prompt>
 | 
			
		||||
    <help v-show="showHelp" :class="{ active: showHelp }"></help>
 | 
			
		||||
    <div v-show="$store.getters.showOverlay" @click="resetPrompts" class="overlay" :class="{ active: $store.getters.showOverlay }"></div>
 | 
			
		||||
    <div v-show="showOverlay" @click="resetPrompts" class="overlay" :class="{ active: showOverlay }"></div>
 | 
			
		||||
 | 
			
		||||
    <footer>Served with <a rel="noopener noreferrer" href="https://github.com/hacdias/caddy-filemanager">File Manager</a>.</footer>
 | 
			
		||||
  </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +129,10 @@ export default {
 | 
			
		|||
    NewDirPrompt
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapGetters(['selectedCount']),
 | 
			
		||||
    ...mapGetters([
 | 
			
		||||
      'selectedCount',
 | 
			
		||||
      'showOverlay'
 | 
			
		||||
    ]),
 | 
			
		||||
    ...mapState([
 | 
			
		||||
      'req',
 | 
			
		||||
      'user',
 | 
			
		||||
| 
						 | 
				
			
			@ -143,37 +146,28 @@ export default {
 | 
			
		|||
      'showNewFile',
 | 
			
		||||
      'showNewDir',
 | 
			
		||||
      'showDownload'
 | 
			
		||||
    ])
 | 
			
		||||
    ]),
 | 
			
		||||
    isListing () {
 | 
			
		||||
      return this.req.kind === 'listing' && !this.loading
 | 
			
		||||
    },
 | 
			
		||||
    isPreview () {
 | 
			
		||||
      return this.req.kind === 'preview' && !this.loading
 | 
			
		||||
    },
 | 
			
		||||
    isEditor () {
 | 
			
		||||
      return this.req.kind === 'editor' && !this.loading
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  data: function () {
 | 
			
		||||
    return {
 | 
			
		||||
      plugins: []
 | 
			
		||||
      plugins: [],
 | 
			
		||||
      loading: true
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  beforeRouteEnter (to, from, next) {
 | 
			
		||||
    api.fetch(to.params[0])
 | 
			
		||||
    .then(() => {
 | 
			
		||||
      next()
 | 
			
		||||
    })
 | 
			
		||||
    .catch(error => {
 | 
			
		||||
      // TODO: 404, 403 and 500!
 | 
			
		||||
      console.log(error)
 | 
			
		||||
      window.alert('Something went wrong. Please reload.')
 | 
			
		||||
    })
 | 
			
		||||
  created () {
 | 
			
		||||
    this.fetchData()
 | 
			
		||||
  },
 | 
			
		||||
  beforeRouteUpdate (to, from, next) {
 | 
			
		||||
    this.$store.commit('resetSelected')
 | 
			
		||||
    this.$store.commit('multiple', false)
 | 
			
		||||
 | 
			
		||||
    api.fetch(to.params[0])
 | 
			
		||||
    .then(() => {
 | 
			
		||||
      next()
 | 
			
		||||
    })
 | 
			
		||||
    .catch(error => {
 | 
			
		||||
      // TODO: 404, 403 and 500!
 | 
			
		||||
      console.log(error)
 | 
			
		||||
      window.alert('Something went wrong. Please reload.')
 | 
			
		||||
    })
 | 
			
		||||
  watch: {
 | 
			
		||||
    '$route': 'fetchData'
 | 
			
		||||
  },
 | 
			
		||||
  mounted () {
 | 
			
		||||
    updateColumnSizes()
 | 
			
		||||
| 
						 | 
				
			
			@ -183,38 +177,6 @@ export default {
 | 
			
		|||
      this.plugins = window.plugins
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    document.title = this.req.name
 | 
			
		||||
    window.history.replaceState({
 | 
			
		||||
      url: window.location.pathname,
 | 
			
		||||
      name: document.title
 | 
			
		||||
    }, document.title, window.location.pathname)
 | 
			
		||||
 | 
			
		||||
    /* window.addEventListener('popstate', (event) => {
 | 
			
		||||
      event.preventDefault()
 | 
			
		||||
      event.stopPropagation()
 | 
			
		||||
 | 
			
		||||
      this.$store.commit('multiple', false)
 | 
			
		||||
      this.$store.commit('resetSelected')
 | 
			
		||||
      this.$store.commit('resetPrompts')
 | 
			
		||||
 | 
			
		||||
      let request = new window.XMLHttpRequest()
 | 
			
		||||
      request.open('GET', event.state.url, true)
 | 
			
		||||
      request.setRequestHeader('Accept', 'application/json')
 | 
			
		||||
 | 
			
		||||
      request.onload = () => {
 | 
			
		||||
        if (request.status === 200) {
 | 
			
		||||
          let req = JSON.parse(request.responseText)
 | 
			
		||||
          this.$store.commit('updateRequest', req)
 | 
			
		||||
          document.title = event.state.name
 | 
			
		||||
        } else {
 | 
			
		||||
          console.log(request.responseText)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      request.onerror = (error) => { console.log(error) }
 | 
			
		||||
      request.send()
 | 
			
		||||
    }) */
 | 
			
		||||
 | 
			
		||||
    window.addEventListener('keydown', (event) => {
 | 
			
		||||
      // Esc!
 | 
			
		||||
      if (event.keyCode === 27) {
 | 
			
		||||
| 
						 | 
				
			
			@ -270,6 +232,33 @@ export default {
 | 
			
		|||
    })
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    fetchData () {
 | 
			
		||||
      this.loading = true
 | 
			
		||||
      // Reset selected items and multiple selection.
 | 
			
		||||
      this.$store.commit('resetSelected')
 | 
			
		||||
      this.$store.commit('multiple', false)
 | 
			
		||||
 | 
			
		||||
      let url = this.$route.path
 | 
			
		||||
      if (url === '') url = '/'
 | 
			
		||||
      if (url[0] !== '/') url = '/' + url
 | 
			
		||||
 | 
			
		||||
      console.log('Going to ' + url)
 | 
			
		||||
 | 
			
		||||
      api.fetch(url)
 | 
			
		||||
      .then((trueURL) => {
 | 
			
		||||
        if (!url.endsWith('/') && trueURL.endsWith('/')) {
 | 
			
		||||
          window.history.replaceState(window.history.state, document.title, window.location.pathname + '/')
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.loading = false
 | 
			
		||||
      })
 | 
			
		||||
      .catch(error => {
 | 
			
		||||
        // TODO: 404, 403 and 500!
 | 
			
		||||
        console.log(error)
 | 
			
		||||
 | 
			
		||||
        this.loading = false
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    showUpload: function () {
 | 
			
		||||
      if (this.req.kind === 'editor') return false
 | 
			
		||||
      return this.user.allowNew
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,11 +16,11 @@
 | 
			
		|||
      <audio v-else-if="req.type == 'audio'" :src="raw()" controls></audio>
 | 
			
		||||
      <video v-else-if="req.type == 'video'" :src="raw()" controls>
 | 
			
		||||
        Sorry, your browser doesn't support embedded videos,
 | 
			
		||||
        but don't worry, you can <a href="?download=true">download it</a>
 | 
			
		||||
        but don't worry, you can <a :href="download()">download it</a>
 | 
			
		||||
        and watch it with your favorite video player!
 | 
			
		||||
      </video>
 | 
			
		||||
      <object v-else-if="req.extension == '.pdf'" class="pdf" :data="raw()"></object>
 | 
			
		||||
      <a v-else-if="req.type == 'blob'" href="?download=true">
 | 
			
		||||
      <a v-else-if="req.type == 'blob'" :href="download()">
 | 
			
		||||
        <h2 class="message">Download <i class="material-icons">file_download</i></h2>
 | 
			
		||||
      </a>
 | 
			
		||||
      <pre v-else >{{ req.content }}</pre>
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +30,7 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapState } from 'vuex'
 | 
			
		||||
import page from '../utils/page'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
import InfoButton from './buttons/InfoButton'
 | 
			
		||||
import DeleteButton from './buttons/DeleteButton'
 | 
			
		||||
import RenameButton from './buttons/RenameButton'
 | 
			
		||||
| 
						 | 
				
			
			@ -46,12 +46,19 @@ export default {
 | 
			
		|||
  },
 | 
			
		||||
  computed: mapState(['req']),
 | 
			
		||||
  methods: {
 | 
			
		||||
    download: function () {
 | 
			
		||||
      let url = `${this.$store.state.baseURL}/api/download/`
 | 
			
		||||
      url += this.req.url.slice(6)
 | 
			
		||||
      url += `?token=${this.$store.state.jwt}`
 | 
			
		||||
 | 
			
		||||
      return url
 | 
			
		||||
    },
 | 
			
		||||
    raw: function () {
 | 
			
		||||
      return this.req.url + '?raw=true'
 | 
			
		||||
      return `${this.download()}&inline=true`
 | 
			
		||||
    },
 | 
			
		||||
    back: function (event) {
 | 
			
		||||
      let url = page.removeLastDir(window.location.pathname) + '/'
 | 
			
		||||
      page.open(url)
 | 
			
		||||
      let uri = url.removeLastDir(this.$route.path) + '/'
 | 
			
		||||
      this.$router.push({ path: uri })
 | 
			
		||||
    },
 | 
			
		||||
    allowEdit: function (event) {
 | 
			
		||||
      return this.$store.state.user.allowEdit
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapState } from 'vuex'
 | 
			
		||||
import page from '../utils/page'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'search',
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ export default {
 | 
			
		|||
      let uri = window.location.host + window.location.pathname
 | 
			
		||||
 | 
			
		||||
      if (this.$store.state.req.kind !== 'listing') {
 | 
			
		||||
        uri = page.removeLastDir(uri) + '/'
 | 
			
		||||
        uri = url.removeLastDir(uri) + '/'
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      uri = `${(this.$store.state.ssl ? 'wss:' : 'ws:')}//${uri}`
 | 
			
		||||
| 
						 | 
				
			
			@ -110,7 +110,7 @@ export default {
 | 
			
		|||
        conn.onclose = (event) => {
 | 
			
		||||
          this.ongoing = false
 | 
			
		||||
          this.scrollable.scrollTop = this.scrollable.scrollHeight
 | 
			
		||||
          page.reload()
 | 
			
		||||
          // page.reload()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,10 @@ export default {
 | 
			
		|||
  methods: {
 | 
			
		||||
    download: function (event) {
 | 
			
		||||
      if (this.req.kind !== 'listing') {
 | 
			
		||||
        window.open(`${window.location.pathname}?download=true`)
 | 
			
		||||
        let url = this.$route.params[0]
 | 
			
		||||
        url = this.$store.state.baseURL + '/api/download/' + url
 | 
			
		||||
        url += '?token=' + this.$store.state.jwt
 | 
			
		||||
        window.open(url)
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,8 +12,8 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
import {mapGetters, mapMutations, mapState} from 'vuex'
 | 
			
		||||
import webdav from '@/utils/webdav'
 | 
			
		||||
import page from '@/utils/page'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'delete-prompt',
 | 
			
		||||
| 
						 | 
				
			
			@ -28,10 +28,10 @@ export default {
 | 
			
		|||
      // buttons.setLoading('delete')
 | 
			
		||||
 | 
			
		||||
      if (this.req.kind !== 'listing') {
 | 
			
		||||
        webdav.trash(window.location.pathname)
 | 
			
		||||
        api.delete(this.$route.path)
 | 
			
		||||
          .then(() => {
 | 
			
		||||
            // buttons.setDone('delete')
 | 
			
		||||
            page.open(page.removeLastDir(window.location.pathname) + '/')
 | 
			
		||||
            this.$router.push({path: url.removeLastDir(this.$route.path) + '/'})
 | 
			
		||||
          })
 | 
			
		||||
          .catch(error => {
 | 
			
		||||
            // buttons.setDone('delete', false)
 | 
			
		||||
| 
						 | 
				
			
			@ -49,17 +49,17 @@ export default {
 | 
			
		|||
      let promises = []
 | 
			
		||||
 | 
			
		||||
      for (let index of this.selected) {
 | 
			
		||||
        promises.push(webdav.trash(this.req.items[index].url))
 | 
			
		||||
        promises.push(api.delete(this.req.items[index].url))
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      Promise.all(promises)
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          page.reload()
 | 
			
		||||
          // page.reload()
 | 
			
		||||
          // buttons.setDone('delete')
 | 
			
		||||
        })
 | 
			
		||||
        .catch(error => {
 | 
			
		||||
          console.log(error)
 | 
			
		||||
          page.reload()
 | 
			
		||||
          // page.reload()
 | 
			
		||||
          // buttons.setDone('delete', false)
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,10 @@ export default {
 | 
			
		|||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    download: function (format) {
 | 
			
		||||
      let uri = `${window.location.pathname}?download=${format}`
 | 
			
		||||
      let uri = this.$route.params[0]
 | 
			
		||||
      uri = this.$store.state.baseURL + '/api/download/' + uri
 | 
			
		||||
      uri += `?token=${this.$store.state.jwt}`
 | 
			
		||||
      uri += `&format=${format}`
 | 
			
		||||
 | 
			
		||||
      if (this.selectedCount > 0) {
 | 
			
		||||
        let files = ''
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,7 @@
 | 
			
		|||
import {mapState, mapGetters} from 'vuex'
 | 
			
		||||
import filesize from 'filesize'
 | 
			
		||||
import moment from 'moment'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'info-prompt',
 | 
			
		||||
| 
						 | 
				
			
			@ -80,28 +81,21 @@ export default {
 | 
			
		|||
    checksum: function (event, hash) {
 | 
			
		||||
      event.preventDefault()
 | 
			
		||||
 | 
			
		||||
      let request = new window.XMLHttpRequest()
 | 
			
		||||
      let link
 | 
			
		||||
 | 
			
		||||
      if (this.selectedCount) {
 | 
			
		||||
        link = this.req.items[this.selected[0]].url
 | 
			
		||||
      } else {
 | 
			
		||||
        link = window.location.pathname
 | 
			
		||||
        link = this.$route.path
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      request.open('GET', `${link}?checksum=${hash}`, true)
 | 
			
		||||
 | 
			
		||||
      request.onload = () => {
 | 
			
		||||
        if (request.status >= 300) {
 | 
			
		||||
          console.log(request.statusText)
 | 
			
		||||
          return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        event.target.innerHTML = request.responseText
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      request.onerror = (e) => console.log(e)
 | 
			
		||||
      request.send()
 | 
			
		||||
      api.checksum(link, hash)
 | 
			
		||||
        .then((hash) => {
 | 
			
		||||
          event.target.innerHTML = hash
 | 
			
		||||
        })
 | 
			
		||||
        .catch(error => {
 | 
			
		||||
          console.log(error)
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,8 +18,8 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapState } from 'vuex'
 | 
			
		||||
import page from '@/utils/page'
 | 
			
		||||
import webdav from '@/utils/webdav'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'move-prompt',
 | 
			
		||||
| 
						 | 
				
			
			@ -31,10 +31,10 @@ export default {
 | 
			
		|||
  },
 | 
			
		||||
  computed: mapState(['req', 'selected', 'baseURL']),
 | 
			
		||||
  mounted: function () {
 | 
			
		||||
    if (window.location.pathname !== this.baseURL + '/') {
 | 
			
		||||
    if (this.$route.path !== '/files/') {
 | 
			
		||||
      this.items.push({
 | 
			
		||||
        name: '..',
 | 
			
		||||
        url: page.removeLastDir(window.location.pathname) + '/'
 | 
			
		||||
        url: url.removeLastDir(this.$route.path) + '/'
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ export default {
 | 
			
		|||
        let to = dest + '/' + encodeURIComponent(this.req.items[item].name)
 | 
			
		||||
        to = to.replace('//', '/')
 | 
			
		||||
 | 
			
		||||
        promises.push(webdav.move(from, to))
 | 
			
		||||
        promises.push(api.move(from, to))
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this.$store.commit('showMove', false)
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ export default {
 | 
			
		|||
      Promise.all(promises)
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          // buttons.setDone('move')
 | 
			
		||||
          page.open(dest)
 | 
			
		||||
          this.$router.push({page: dest})
 | 
			
		||||
        })
 | 
			
		||||
        .catch(e => {
 | 
			
		||||
          // buttons.setDone('move', false)
 | 
			
		||||
| 
						 | 
				
			
			@ -86,16 +86,16 @@ export default {
 | 
			
		|||
        })
 | 
			
		||||
    },
 | 
			
		||||
    next: function (event) {
 | 
			
		||||
      let url = event.currentTarget.dataset.url
 | 
			
		||||
      this.json(url)
 | 
			
		||||
      let uri = event.currentTarget.dataset.url
 | 
			
		||||
      this.json(uri)
 | 
			
		||||
        .then((data) => {
 | 
			
		||||
          this.current = url
 | 
			
		||||
          this.current = uri
 | 
			
		||||
          this.items = []
 | 
			
		||||
 | 
			
		||||
          if (url !== this.baseURL + '/') {
 | 
			
		||||
          if (uri !== this.baseURL + '/') {
 | 
			
		||||
            this.items.push({
 | 
			
		||||
              name: '..',
 | 
			
		||||
              url: page.removeLastDir(url) + '/'
 | 
			
		||||
              url: url.removeLastDir(uri) + '/'
 | 
			
		||||
            })
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ export default {
 | 
			
		|||
 | 
			
		||||
            this.items.push({
 | 
			
		||||
              name: item.name,
 | 
			
		||||
              url: item.url
 | 
			
		||||
              url: item.uri
 | 
			
		||||
            })
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,8 +11,8 @@
 | 
			
		|||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import page from '@/utils/page'
 | 
			
		||||
import webdav from '@/utils/webdav'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'new-dir-prompt',
 | 
			
		||||
| 
						 | 
				
			
			@ -26,23 +26,23 @@ export default {
 | 
			
		|||
      event.preventDefault()
 | 
			
		||||
      if (this.new === '') return
 | 
			
		||||
 | 
			
		||||
      let url = window.location.pathname
 | 
			
		||||
      let uri = window.location.pathname
 | 
			
		||||
      if (this.$store.state.req.kind !== 'listing') {
 | 
			
		||||
        url = page.removeLastDir(url) + '/'
 | 
			
		||||
        uri = url.removeLastDir(uri) + '/'
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      url += this.name + '/'
 | 
			
		||||
      url = url.replace('//', '/')
 | 
			
		||||
      uri += this.name + '/'
 | 
			
		||||
      uri = uri.replace('//', '/')
 | 
			
		||||
 | 
			
		||||
      // buttons.setLoading('newDir')
 | 
			
		||||
      webdav.create(url)
 | 
			
		||||
      api.put(uri)
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          // buttons.setDone('newDir')
 | 
			
		||||
          page.open(url)
 | 
			
		||||
          this.$router.push({ path: uri })
 | 
			
		||||
        })
 | 
			
		||||
        .catch(e => {
 | 
			
		||||
        .catch(error => {
 | 
			
		||||
          // buttons.setDone('newDir', false)
 | 
			
		||||
          console.log(e)
 | 
			
		||||
          console.log(error)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
      this.$store.commit('showNewDir', false)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,8 +11,8 @@
 | 
			
		|||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import page from '@/utils/page'
 | 
			
		||||
import webdav from '@/utils/webdav'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'new-file-prompt',
 | 
			
		||||
| 
						 | 
				
			
			@ -26,23 +26,23 @@ export default {
 | 
			
		|||
      event.preventDefault()
 | 
			
		||||
      if (this.new === '') return
 | 
			
		||||
 | 
			
		||||
      let url = window.location.pathname
 | 
			
		||||
      let uri = window.location.pathname
 | 
			
		||||
      if (this.$store.state.req.kind !== 'listing') {
 | 
			
		||||
        url = page.removeLastDir(url) + '/'
 | 
			
		||||
        uri = url.removeLastDir(uri) + '/'
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      url += this.name
 | 
			
		||||
      url = url.replace('//', '/')
 | 
			
		||||
      uri += this.name
 | 
			
		||||
      uri = uri.replace('//', '/')
 | 
			
		||||
 | 
			
		||||
      // buttons.setLoading('newFile')
 | 
			
		||||
      webdav.create(url)
 | 
			
		||||
      api.put(uri)
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          // buttons.setDone('newFile')
 | 
			
		||||
          page.open(url)
 | 
			
		||||
          this.$router.push({ path: uri })
 | 
			
		||||
        })
 | 
			
		||||
        .catch(e => {
 | 
			
		||||
        .catch(error => {
 | 
			
		||||
          // buttons.setDone('newFile', false)
 | 
			
		||||
          console.log(e)
 | 
			
		||||
          console.log(error)
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
      this.$store.commit('showNewFile', false)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,8 +12,8 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapState } from 'vuex'
 | 
			
		||||
import page from '@/utils/page'
 | 
			
		||||
import webdav from '@/utils/webdav'
 | 
			
		||||
import url from '@/utils/url'
 | 
			
		||||
import api from '@/utils/api'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'rename-prompt',
 | 
			
		||||
| 
						 | 
				
			
			@ -50,19 +50,21 @@ export default {
 | 
			
		|||
      }
 | 
			
		||||
 | 
			
		||||
      this.name = encodeURIComponent(this.name)
 | 
			
		||||
      newLink = page.removeLastDir(oldLink) + '/' + this.name
 | 
			
		||||
      newLink = url.removeLastDir(oldLink) + '/' + this.name
 | 
			
		||||
 | 
			
		||||
      // buttons.setLoading('rename')
 | 
			
		||||
 | 
			
		||||
      webdav.move(oldLink, newLink)
 | 
			
		||||
      api.move(oldLink, newLink)
 | 
			
		||||
        .then(() => {
 | 
			
		||||
          if (this.req.kind !== 'listing') {
 | 
			
		||||
            page.open(newLink)
 | 
			
		||||
            this.$router.push({ path: newLink })
 | 
			
		||||
            return
 | 
			
		||||
          }
 | 
			
		||||
          // TODO: keep selected after reload?
 | 
			
		||||
          page.reload()
 | 
			
		||||
          // page.reload()
 | 
			
		||||
          // buttons.setDone('rename')
 | 
			
		||||
          console.log('reload')
 | 
			
		||||
          this.$router.go({ path: this.$route.path })
 | 
			
		||||
        }).catch(error => {
 | 
			
		||||
          // buttons.setDone('rename', false)
 | 
			
		||||
          console.log(error)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,12 @@ const router = new Router({
 | 
			
		|||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/',
 | 
			
		||||
      redirect: {
 | 
			
		||||
        path: '/files/'
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/*',
 | 
			
		||||
      component: Main,
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +39,7 @@ const router = new Router({
 | 
			
		|||
      },
 | 
			
		||||
      children: [
 | 
			
		||||
        {
 | 
			
		||||
          path: '/files*',
 | 
			
		||||
          path: '/files/*',
 | 
			
		||||
          name: 'Files'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,26 +1,126 @@
 | 
			
		|||
import store from '../store/store'
 | 
			
		||||
 | 
			
		||||
function removePrefix (url) {
 | 
			
		||||
  if (url.startsWith('/files')) {
 | 
			
		||||
    return url.slice(6)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return url
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function fetch (url) {
 | 
			
		||||
  url = removePrefix(url)
 | 
			
		||||
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('GET', `${store.state.baseURL}/api/resource${url}`, true)
 | 
			
		||||
    request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
 | 
			
		||||
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 200) {
 | 
			
		||||
        let req = JSON.parse(request.responseText)
 | 
			
		||||
        store.commit('updateRequest', req)
 | 
			
		||||
        document.title = req.name
 | 
			
		||||
        resolve()
 | 
			
		||||
      } else {
 | 
			
		||||
        reject()
 | 
			
		||||
      switch (request.status) {
 | 
			
		||||
        case 200:
 | 
			
		||||
          let req = JSON.parse(request.responseText)
 | 
			
		||||
          store.commit('updateRequest', req)
 | 
			
		||||
          document.title = req.name
 | 
			
		||||
          resolve(req.url)
 | 
			
		||||
          break
 | 
			
		||||
        default:
 | 
			
		||||
          reject(request.status)
 | 
			
		||||
          break
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    request.onerror = () => reject()
 | 
			
		||||
    request.onerror = (error) => reject(error)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function rm (url) {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('DELETE', `${store.state.baseURL}/api/resource${url}`, true)
 | 
			
		||||
    request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
 | 
			
		||||
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 200) {
 | 
			
		||||
        resolve(request.responseText)
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.responseText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    request.onerror = (error) => reject(error)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function put (url) {
 | 
			
		||||
  url = removePrefix(url)
 | 
			
		||||
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('PUT', `${store.state.baseURL}/api/resource${url}`, true)
 | 
			
		||||
    request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
 | 
			
		||||
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 200) {
 | 
			
		||||
        resolve(request.responseText)
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.responseText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    request.onerror = (error) => reject(error)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function move (oldLink, newLink) {
 | 
			
		||||
  oldLink = removePrefix(oldLink)
 | 
			
		||||
  newLink = removePrefix(newLink)
 | 
			
		||||
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('POST', `${store.state.baseURL}/api/resource${oldLink}`, true)
 | 
			
		||||
    request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
 | 
			
		||||
    request.setRequestHeader('Destination', newLink)
 | 
			
		||||
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 200) {
 | 
			
		||||
        resolve(request.responseText)
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.responseText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    request.onerror = (error) => reject(error)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function checksum (url, algo) {
 | 
			
		||||
  url = removePrefix(url)
 | 
			
		||||
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('GET', `${store.state.baseURL}/api/checksum${url}?algo=${algo}`, true)
 | 
			
		||||
    request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
 | 
			
		||||
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 200) {
 | 
			
		||||
        resolve(request.responseText)
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.responseText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    request.onerror = (error) => reject(error)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  fetch
 | 
			
		||||
  delete: rm,
 | 
			
		||||
  fetch,
 | 
			
		||||
  checksum,
 | 
			
		||||
  move,
 | 
			
		||||
  put
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,87 +0,0 @@
 | 
			
		|||
import store from '../store/store'
 | 
			
		||||
 | 
			
		||||
function convertURL (url) {
 | 
			
		||||
  return window.location.origin + url.replace(store.state.baseURL + '/', store.state.webDavURL + '/')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function move (oldLink, newLink) {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
 | 
			
		||||
    oldLink = convertURL(oldLink)
 | 
			
		||||
    newLink = newLink.replace(store.state.baseURL + '/', store.state.webDavURL + '/')
 | 
			
		||||
    newLink = window.location.origin + newLink.substring(store.state.baseURL.length)
 | 
			
		||||
 | 
			
		||||
    request.open('MOVE', oldLink, true)
 | 
			
		||||
    request.setRequestHeader('Destination', newLink)
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 201 || request.status === 204) {
 | 
			
		||||
        resolve()
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.statusText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    request.onerror = () => reject(request.statusText)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function put (link, body, headers = {}) {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('PUT', convertURL(link), true)
 | 
			
		||||
 | 
			
		||||
    for (let key in headers) {
 | 
			
		||||
      request.setRequestHeader(key, headers[key])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 201) {
 | 
			
		||||
        resolve()
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.statusText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    request.onerror = () => reject(request.statusText)
 | 
			
		||||
    request.send(body)
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function trash (link) {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open('DELETE', convertURL(link), true)
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 204) {
 | 
			
		||||
        resolve()
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.statusText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    request.onerror = () => reject(request.statusText)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function create (link) {
 | 
			
		||||
  return new Promise((resolve, reject) => {
 | 
			
		||||
    let request = new window.XMLHttpRequest()
 | 
			
		||||
    request.open((link.endsWith('/') ? 'MKCOL' : 'PUT'), convertURL(link), true)
 | 
			
		||||
    request.onload = () => {
 | 
			
		||||
      if (request.status === 201) {
 | 
			
		||||
        resolve()
 | 
			
		||||
      } else {
 | 
			
		||||
        reject(request.statusText)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    request.onerror = () => reject(request.statusText)
 | 
			
		||||
    request.send()
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  create: create,
 | 
			
		||||
  trash: trash,
 | 
			
		||||
  put: put,
 | 
			
		||||
  move: move
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								auth.go
								
								
								
								
							
							
						
						
									
										19
									
								
								auth.go
								
								
								
								
							| 
						 | 
				
			
			@ -86,16 +86,31 @@ func renewAuthHandler(c *requestContext, w http.ResponseWriter, r *http.Request)
 | 
			
		|||
	return 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type extractor []string
 | 
			
		||||
 | 
			
		||||
func (e extractor) ExtractToken(r *http.Request) (string, error) {
 | 
			
		||||
	token, _ := request.AuthorizationHeaderExtractor.ExtractToken(r)
 | 
			
		||||
	if token != "" {
 | 
			
		||||
		return token, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	token, _ = request.ArgumentExtractor{"token"}.ExtractToken(r)
 | 
			
		||||
	if token != "" {
 | 
			
		||||
		return token, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return "", request.ErrNoTokenInRequest
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// validateAuth is used to validate the authentication and returns the
 | 
			
		||||
// User if it is valid.
 | 
			
		||||
func validateAuth(c *requestContext, r *http.Request) (bool, *User) {
 | 
			
		||||
	keyFunc := func(token *jwt.Token) (interface{}, error) {
 | 
			
		||||
		return c.fm.key, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var claims claims
 | 
			
		||||
	token, err := request.ParseFromRequestWithClaims(r,
 | 
			
		||||
		request.AuthorizationHeaderExtractor,
 | 
			
		||||
		extractor{},
 | 
			
		||||
		&claims,
 | 
			
		||||
		keyFunc,
 | 
			
		||||
	)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,12 @@ func downloadHandler(c *requestContext, w http.ResponseWriter, r *http.Request)
 | 
			
		|||
	query := r.URL.Query().Get("format")
 | 
			
		||||
 | 
			
		||||
	if !c.fi.IsDir {
 | 
			
		||||
		w.Header().Set("Content-Disposition", "attachment; filename="+c.fi.Name)
 | 
			
		||||
		if r.URL.Query().Get("inline") == "true" {
 | 
			
		||||
			w.Header().Set("Content-Disposition", "inline")
 | 
			
		||||
		} else {
 | 
			
		||||
			w.Header().Set("Content-Disposition", "attachment; filename="+c.fi.Name)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		http.ServeFile(w, r, c.fi.Path)
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue